Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package itstool for openSUSE:Factory checked in at 2021-10-20 20:23:01 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/itstool (Old) and /work/SRC/openSUSE:Factory/.itstool.new.1890 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "itstool" Wed Oct 20 20:23:01 2021 rev:23 rq:926172 version:2.0.7 Changes: -------- --- /work/SRC/openSUSE:Factory/itstool/itstool.changes 2019-11-24 00:14:48.807131118 +0100 +++ /work/SRC/openSUSE:Factory/.itstool.new.1890/itstool.changes 2021-10-20 20:23:27.337347383 +0200 @@ -1,0 +2,7 @@ +Sat Oct 16 17:40:49 UTC 2021 - Dirk M??ller <dmuel...@suse.com> + +- update to 2.0.7: + * Performance improvements when chaining up on certain ITS rules + * Performance improvements when using ITS params. + +------------------------------------------------------------------- Old: ---- itstool-2.0.6.tar.bz2 New: ---- itstool-2.0.7.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ itstool.spec ++++++ --- /var/tmp/diff_new_pack.TWfx7b/_old 2021-10-20 20:23:27.837347692 +0200 +++ /var/tmp/diff_new_pack.TWfx7b/_new 2021-10-20 20:23:27.837347692 +0200 @@ -1,7 +1,7 @@ # # spec file for package itstool # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2021 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,15 +17,15 @@ Name: itstool -Version: 2.0.6 +Version: 2.0.7 Release: 0 Summary: Tool to translate XML documents using PO files License: GPL-3.0-or-later Group: Development/Tools/Other URL: http://itstool.org Source: http://files.itstool.org/itstool/%{name}-%{version}.tar.bz2 - BuildRequires: python3-base +BuildArch: noarch %if 0%{?sle_version} BuildRequires: python3-libxml2-python Requires: python3-libxml2-python @@ -33,7 +33,6 @@ BuildRequires: python3-libxml2 Requires: python3-libxml2 %endif -BuildArch: noarch %description ITS Tool extracts messages from XML files and outputs PO template files, then @@ -48,7 +47,7 @@ sed -i -e "/^echo.*import/s/python/python3/" configure export PYTHON=%{_bindir}/python3 %configure -make %{?_smp_mflags} +%make_build %install %make_install PYTHON=%{_bindir}/python3 ++++++ itstool-2.0.6.tar.bz2 -> itstool-2.0.7.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/itstool-2.0.6/ChangeLog new/itstool-2.0.7/ChangeLog --- old/itstool-2.0.6/ChangeLog 2019-04-06 20:39:21.000000000 +0200 +++ new/itstool-2.0.7/ChangeLog 2021-09-25 17:10:07.000000000 +0200 @@ -1,3 +1,81 @@ +commit e21be796ad7c274674aa62817b405569039f669f +Merge: db42353 f1c747a +Author: Shaun McCance <sha...@redhat.com> +Date: Sat Dec 26 22:36:28 2020 -0500 + + Merge pull request #40 from ptoscano/update-gitignore + + Update .gitignore + +commit db42353587f48f3885f55f1998e4cabbb4c359e2 +Author: Shaun McCance <sha...@redhat.com> +Date: Sat Dec 26 15:50:32 2020 -0500 + + Fix errors from accidental global variable removal + + In a recent commit for profiling, I moved the __main__ code to a main() + function. This broke some stuff that relied on an accidentally global + variable. Now the variable gets passed as a param, as it should. + + itstool.in | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +commit decbd0e50e824ee0241b36c07c5652b1af47ff20 +Author: Shaun McCance <sha...@redhat.com> +Date: Sat Dec 12 10:40:30 2020 -0500 + + Cache computed values for translate, localefilter, and locnote + + If these aren't explicitly set for a node with a selector or local markup, + then we have to chain up, often all the way to the root. But we were doing + this over and over again, chaining up across the same nodes. This change + stores the computed value, so chaining up usually hits that cache. I was + careful to clear the cache if new rules are applied. + + itstool.in | 41 +++++++++++++++++++++++++++++++++++------ + 1 file changed, 35 insertions(+), 6 deletions(-) + +commit 366dbb36b897dc223b41a1855ea1f3075ad565ba +Author: Shaun McCance <sha...@redhat.com> +Date: Sun Dec 6 13:44:24 2020 -0500 + + Don't re-lookup ITS params for every single rule + + We have to create a new XPath context for every rule, and we have + to freshly apply any ITS params to that context. But what we were + also doing is looking thru the children of the parent ITS rules + element for param element each time. This was inefficient. Looking + for param elements only once per ruleset gives a small but measurable + speed boost. + + itstool.in | 65 +++++++++++++++++++++++++++++++++++++------------------------- + 1 file changed, 39 insertions(+), 26 deletions(-) + +commit f1c747ae846e7d54fc8e3facd020a7d080560d76 +Author: Pino Toscano <ptosc...@redhat.com> +Date: Tue May 19 07:38:33 2020 +0200 + + Update .gitignore + + - remove entries referring to non-existing stuff + - prefix files appearing in the top-level directory with '/' + - add '/' as suffix for directories + - add '*.mo' for files created during the test run + - sort the entries + + .gitignore | 27 ++++++++++++--------------- + 1 file changed, 12 insertions(+), 15 deletions(-) + +commit 60f3a955ca047b1d62a1d952beec74afaff7cbbf +Author: Shaun McCance <sha...@redhat.com> +Date: Sat Apr 6 14:55:49 2019 -0400 + + Version 2.0.6 + + NEWS | 5 +++++ + configure.ac | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + commit ce3e235efbe251083f257e0b1cfdaa11e4f7b01c Author: Shaun McCance <sha...@redhat.com> Date: Sun Dec 30 16:31:05 2018 -0500 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/itstool-2.0.6/Makefile.in new/itstool-2.0.7/Makefile.in --- old/itstool-2.0.6/Makefile.in 2019-04-06 20:39:19.000000000 +0200 +++ new/itstool-2.0.7/Makefile.in 2021-09-25 17:10:04.000000000 +0200 @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.15.1 from Makefile.am. +# Makefile.in generated by automake 1.16.2 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2017 Free Software Foundation, Inc. +# Copyright (C) 1994-2020 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -164,7 +164,7 @@ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - cscope distdir dist dist-all distcheck + cscope distdir distdir-am dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is @@ -306,6 +306,7 @@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -350,8 +351,8 @@ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) @@ -553,7 +554,10 @@ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files -distdir: $(DISTFILES) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ @@ -632,6 +636,10 @@ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) +dist-zstd: distdir + tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst + $(am__post_remove_distdir) + dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @@ -674,6 +682,8 @@ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ + *.tar.zst*) \ + zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) @@ -855,7 +865,7 @@ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ - distcheck distclean distclean-generic distclean-tags \ + dist-zstd distcheck distclean distclean-generic distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-binSCRIPTS \ install-data install-data-am install-dvi install-dvi-am \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/itstool-2.0.6/NEWS new/itstool-2.0.7/NEWS --- old/itstool-2.0.6/NEWS 2019-04-06 20:39:02.000000000 +0200 +++ new/itstool-2.0.7/NEWS 2021-09-25 17:09:43.000000000 +0200 @@ -1,3 +1,8 @@ +2.0.7 +===== +* Performance improvements when chaining up on certain ITS rules +* Performance improvements when using ITS params. + 2.0.6 ===== * Make DocBook keyword element within text diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/itstool-2.0.6/aclocal.m4 new/itstool-2.0.7/aclocal.m4 --- old/itstool-2.0.6/aclocal.m4 2019-04-06 20:39:19.000000000 +0200 +++ new/itstool-2.0.7/aclocal.m4 2021-09-25 17:10:03.000000000 +0200 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.15.1 -*- Autoconf -*- +# generated automatically by aclocal 1.16.2 -*- Autoconf -*- -# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# Copyright (C) 1996-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -20,7 +20,7 @@ If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -# Copyright (C) 2002-2017 Free Software Foundation, Inc. +# Copyright (C) 2002-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -32,10 +32,10 @@ # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.15' +[am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.15.1], [], +m4_if([$1], [1.16.2], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -51,14 +51,14 @@ # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.15.1])dnl +[AM_AUTOMAKE_VERSION([1.16.2])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# Copyright (C) 2001-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -110,7 +110,7 @@ # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# Copyright (C) 1996-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -197,8 +197,8 @@ AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: -# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html> -# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html> +# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html> +# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html> AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. @@ -265,7 +265,7 @@ Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: <http://www.gnu.org/software/coreutils/>. +that behaves properly: <https://www.gnu.org/software/coreutils/>. If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM @@ -307,7 +307,7 @@ done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# Copyright (C) 2001-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -328,7 +328,7 @@ fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2017 Free Software Foundation, Inc. +# Copyright (C) 2003-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -349,7 +349,7 @@ # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2017 Free Software Foundation, Inc. +# Copyright (C) 1997-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -388,7 +388,7 @@ # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# Copyright (C) 2001-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -417,7 +417,7 @@ AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# Copyright (C) 1999-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -450,10 +450,12 @@ [ dnl Find a Python interpreter. Python versions prior to 2.0 are not dnl supported. (2.0 was released on October 16, 2000). - dnl FIXME: Remove the need to hard-code Python versions here. m4_define_default([_AM_PYTHON_INTERPRETER_LIST], -[python python2 python3 python3.5 python3.4 python3.3 python3.2 python3.1 python3.0 python2.7 dnl - python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0]) +[python python2 python3 dnl + python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 dnl + python3.2 python3.1 python3.0 dnl + python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 dnl + python2.0]) AC_ARG_VAR([PYTHON], [the Python interpreter]) @@ -498,12 +500,14 @@ m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) else - dnl Query Python for its version number. Getting [:3] seems to be - dnl the best way to do this; it's what "site.py" does in the standard - dnl library. + dnl Query Python for its version number. Although site.py simply uses + dnl sys.version[:3], printing that failed with Python 3.10, since the + dnl trailing zero was eliminated. So now we output just the major + dnl and minor version numbers, as numbers. Apparently the tertiary + dnl version is not of interest. AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], - [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`]) + [am_cv_python_version=`$PYTHON -c "import sys; print('%u.%u' % sys.version_info[[:2]])"`]) AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) dnl Use the values of $prefix and $exec_prefix for the corresponding @@ -653,7 +657,7 @@ sys.exit(sys.hexversion < minverhex)" AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) -# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# Copyright (C) 2001-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -672,7 +676,7 @@ # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# Copyright (C) 1996-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -753,7 +757,7 @@ rm -f conftest.file ]) -# Copyright (C) 2009-2017 Free Software Foundation, Inc. +# Copyright (C) 2009-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -813,7 +817,7 @@ _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) -# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# Copyright (C) 2001-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -841,7 +845,7 @@ INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2017 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -860,7 +864,7 @@ # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2017 Free Software Foundation, Inc. +# Copyright (C) 2004-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/itstool-2.0.6/configure new/itstool-2.0.7/configure --- old/itstool-2.0.6/configure 2019-04-06 20:39:19.000000000 +0200 +++ new/itstool-2.0.7/configure 2021-09-25 17:10:03.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for itstool 2.0.6. +# Generated by GNU Autoconf 2.69 for itstool 2.0.7. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -576,8 +576,8 @@ # Identity of this package. PACKAGE_NAME='itstool' PACKAGE_TARNAME='itstool' -PACKAGE_VERSION='2.0.6' -PACKAGE_STRING='itstool 2.0.6' +PACKAGE_VERSION='2.0.7' +PACKAGE_STRING='itstool 2.0.7' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -639,6 +639,7 @@ docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -705,6 +706,7 @@ sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -957,6 +959,15 @@ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1094,7 +1105,7 @@ for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1207,7 +1218,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures itstool 2.0.6 to adapt to many kinds of systems. +\`configure' configures itstool 2.0.7 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1247,6 +1258,7 @@ --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -1273,7 +1285,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of itstool 2.0.6:";; + short | recursive ) echo "Configuration of itstool 2.0.7:";; esac cat <<\_ACEOF @@ -1353,7 +1365,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -itstool configure 2.0.6 +itstool configure 2.0.7 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1370,7 +1382,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by itstool $as_me 2.0.6, which was +It was created by itstool $as_me 2.0.7, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -1718,7 +1730,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -am__api_version='1.15' +am__api_version='1.16' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do @@ -2233,7 +2245,7 @@ # Define the identity of the package. PACKAGE='itstool' - VERSION='2.0.6' + VERSION='2.0.7' cat >>confdefs.h <<_ACEOF @@ -2263,8 +2275,8 @@ # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: -# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html> -# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html> +# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html> +# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html> mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The @@ -2315,7 +2327,7 @@ Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: <http://www.gnu.org/software/coreutils/>. +that behaves properly: <https://www.gnu.org/software/coreutils/>. If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM @@ -2377,7 +2389,7 @@ $as_echo_n "(cached) " >&6 else - for am_cv_pathless_PYTHON in python python2 python3 python3.5 python3.4 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do + for am_cv_pathless_PYTHON in python python2 python3 python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do test "$am_cv_pathless_PYTHON" = none && break prog="import sys # split strings by '.' and convert to numeric. Append some zeros @@ -2458,7 +2470,7 @@ if ${am_cv_python_version+:} false; then : $as_echo_n "(cached) " >&6 else - am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"` + am_cv_python_version=`$PYTHON -c "import sys; print('%u.%u' % sys.version_info[:2])"` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5 $as_echo "$am_cv_python_version" >&6; } @@ -3165,7 +3177,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by itstool $as_me 2.0.6, which was +This file was extended by itstool $as_me 2.0.7, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -3218,7 +3230,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -itstool config.status 2.0.6 +itstool config.status 2.0.7 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/itstool-2.0.6/configure.ac new/itstool-2.0.7/configure.ac --- old/itstool-2.0.6/configure.ac 2019-04-06 20:39:09.000000000 +0200 +++ new/itstool-2.0.7/configure.ac 2021-09-25 17:09:48.000000000 +0200 @@ -1,4 +1,4 @@ -AC_INIT([itstool], [2.0.6], []) +AC_INIT([itstool], [2.0.7], []) AM_INIT_AUTOMAKE([1.9 no-dist-gzip dist-bzip2]) DATADIR=`( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/itstool-2.0.6/install-sh new/itstool-2.0.7/install-sh --- old/itstool-2.0.6/install-sh 2019-04-06 20:39:19.000000000 +0200 +++ new/itstool-2.0.7/install-sh 2021-09-25 17:10:04.000000000 +0200 @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2016-01-11.22; # UTC +scriptversion=2018-03-11.20; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -271,15 +271,18 @@ fi dst=$dst_arg - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. + # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst - dst=$dstdir/`basename "$src"` + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac dstdir_status=0 else dstdir=`dirname "$dst"` @@ -288,6 +291,11 @@ fi fi + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac + obsolete_mkdir_used=false if test $dstdir_status != 0; then @@ -324,34 +332,43 @@ # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) + # Note that $RANDOM variable is not portable (e.g. dash); Use it + # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p' feature. if (umask $mkdir_umask && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - ls_ld_tmpdir=`ls -ld "$tmpdir"` + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && - $mkdirprog -m$different_mode -p -- "$tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi - rmdir "$tmpdir/d" "$tmpdir" + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac;; @@ -427,14 +444,25 @@ else # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ + dsttmp=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + (umask $cp_umask && + { test -z "$stripcmd" || { + # Create $dsttmp read-write so that cp doesn't create it read-only, + # which would cause strip to fail. + if test -z "$doit"; then + : >"$dsttmp" # No need to fork-exec 'touch'. + else + $doit touch "$dsttmp" + fi + } + } && + $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # @@ -493,7 +521,7 @@ done # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/itstool-2.0.6/its/Makefile.in new/itstool-2.0.7/its/Makefile.in --- old/itstool-2.0.6/its/Makefile.in 2019-04-06 20:39:19.000000000 +0200 +++ new/itstool-2.0.7/its/Makefile.in 2021-09-25 17:10:04.000000000 +0200 @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.15.1 from Makefile.am. +# Makefile.in generated by automake 1.16.2 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2017 Free Software Foundation, Inc. +# Copyright (C) 1994-2020 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -221,6 +221,7 @@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -252,8 +253,8 @@ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) @@ -292,7 +293,10 @@ cscope cscopelist: -distdir: $(DISTFILES) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/itstool-2.0.6/itstool new/itstool-2.0.7/itstool --- old/itstool-2.0.6/itstool 2019-04-06 20:39:20.000000000 +0200 +++ new/itstool-2.0.7/itstool 2021-09-25 17:10:05.000000000 +0200 @@ -19,7 +19,7 @@ from __future__ import print_function from __future__ import unicode_literals -VERSION="2.0.6" +VERSION="2.0.7" DATADIR="/usr/local/share" import gettext @@ -554,6 +554,8 @@ self._itst_credits = None self._its_externals = {} + self._clear_cache() + def __del__ (self): self._doc.freeDoc() @@ -561,17 +563,27 @@ if self._xml_err: raise libxml2.parserError(self._xml_err) - def register_its_params(self, xpath, rules, params={}): + def _clear_cache(self): + self._its_translate_nodes_cache = {} + self._its_locale_filters_cache = {} + self._its_loc_notes_cache = {} + + def get_its_params(self, rules): + params = {} for child in xml_child_iter(rules): if xml_is_ns_name(child, NS_ITS, 'param'): - name = child.nsProp('name', None) - if name in params: - value = params[name] - else: - value = child.getContent() - xpath.xpathRegisterVariable(name, None, value) + params[child.nsProp('name', None)] = child.getContent() + return params + + def register_its_params(self, xpath, params, userparams={}): + for param in params: + if param in userparams: + xpath.xpathRegisterVariable(name, None, userparams[param]) + else: + xpath.xpathRegisterVariable(name, None, params[param]) def apply_its_rule(self, rule, xpath): + self._clear_cache() if rule.type != 'element': return if xml_is_ns_name(rule, NS_ITS, 'translateRule'): @@ -733,7 +745,8 @@ self._its_externals[node] = res[0].content xpath.setContextNode(oldnode) - def apply_its_rules(self, builtins, params={}): + def apply_its_rules(self, builtins, userparams={}): + self._clear_cache() if builtins: dirs = [] ddir = os.getenv('XDG_DATA_HOME', '') @@ -754,11 +767,12 @@ for dfile in os.listdir(itsdir): if dfile.endswith('.its'): if not ddone.get(dfile, False): - self.apply_its_file(os.path.join(itsdir, dfile), params=params) + self.apply_its_file(os.path.join(itsdir, dfile), userparams=userparams) ddone[dfile] = True - self.apply_local_its_rules(params=params) + self.apply_local_its_rules(userparams=userparams) - def apply_its_file(self, filename, params={}): + def apply_its_file(self, filename, userparams={}): + self._clear_cache() doc = libxml2.parseFile(filename) root = doc.getRootElement() if not xml_is_ns_name(root, NS_ITS, 'rules'): @@ -795,6 +809,7 @@ break if matched == False: return + params = self.get_its_params(root) for rule in xml_child_iter(root): xpath = self._doc.xpathNewContext() par = match @@ -808,10 +823,11 @@ xpath.xpathRegisterNs(nsdef.name, nsdef.content) nsdef = nsdef.next par = par.parent - self.register_its_params(xpath, root, params=params) + self.register_its_params(xpath, params, userparams=userparams) self.apply_its_rule(rule, xpath) - def apply_local_its_rules(self, params={}): + def apply_local_its_rules(self, userparams={}): + self._clear_cache() for rules in self._localrules: def reg_ns(xpath, node): if node.parent is not None: @@ -823,14 +839,15 @@ nsdef = nsdef.next xpath = self._doc.xpathNewContext() reg_ns(xpath, rules) - self.register_its_params(xpath, rules, params=params) + params = self.get_its_params(rules) + self.register_its_params(xpath, params, userparams=userparams) for rule in xml_child_iter(rules): if rule.type != 'element': continue if rule.nsDefs() is not None: rule_xpath = self._doc.xpathNewContext() reg_ns(rule_xpath, rule) - self.register_its_params(rule_xpath, rules, params=params) + self.register_its_params(rule_xpath, params, userparams=userparams) else: rule_xpath = xpath self.apply_its_rule(rule, rule_xpath) @@ -1111,7 +1128,7 @@ self.generate_message(child, None, comments=comments) break - def generate_message (self, node, msg, comments=True, path=None): + def generate_message(self, node, msg, comments=True, path=None): if node.type in ('text', 'cdata') and msg is not None: msg.add_text(node.content) return @@ -1261,6 +1278,8 @@ return False def get_its_translate(self, node): + if node in self._its_translate_nodes_cache: + return self._its_translate_nodes_cache[node] val = None if node.hasNsProp('translate', NS_ITS): val = node.nsProp('translate', NS_ITS) @@ -1269,11 +1288,14 @@ elif node in self._its_translate_nodes: val = self._its_translate_nodes[node] if val is not None: + self._its_translate_nodes_cache[node] = val return val if node.type == 'attribute': return 'no' if node.parent.type == 'element': - return self.get_its_translate(node.parent) + parval = self.get_its_translate(node.parent) + self._its_translate_nodes_cache[node] = parval + return parval return 'yes' def get_its_within_text(self, node): @@ -1288,6 +1310,8 @@ return 'no' def get_its_locale_filter(self, node): + if node in self._its_locale_filters_cache: + return self._its_locale_filters_cache[node] if node.hasNsProp('localeFilterList', NS_ITS) or node.hasNsProp('localeFilterType', NS_ITS): if node.hasNsProp('localeFilterList', NS_ITS): lst = node.nsProp('localeFilterList', NS_ITS) @@ -1312,7 +1336,9 @@ if node in self._its_locale_filters: return self._its_locale_filters[node] if node.parent.type == 'element': - return self.get_its_locale_filter(node.parent) + parval = self.get_its_locale_filter(node.parent) + self._its_locale_filters_cache[node] = parval + return parval return ('*', 'include') def get_itst_drop(self, node): @@ -1328,15 +1354,21 @@ return self._its_id_values.get(node, None) def get_its_loc_notes(self, node, inherit=True): + if node in self._its_loc_notes_cache: + return self._its_loc_notes_cache[node] ret = [] - if node.hasNsProp('locNote', NS_ITS) or node.hasNsProp('locNoteRef', NS_ITS) or node.hasNsProp('locNoteType', NS_ITS): + if ( node.hasNsProp('locNote', NS_ITS) or + node.hasNsProp('locNoteRef', NS_ITS) or + node.hasNsProp('locNoteType', NS_ITS) ): notetype = node.nsProp('locNoteType', NS_ITS) if node.hasNsProp('locNote', NS_ITS): ret.append(LocNote(locnote=node.nsProp('locNote', NS_ITS), locnotetype=notetype)) elif node.hasNsProp('locNoteRef', NS_ITS): ret.append(LocNote(locnoteref=node.nsProp('locNoteRef', NS_ITS), locnotetype=notetype)) elif xml_is_ns_name(node, NS_ITS, 'span'): - if node.hasNsProp('locNote', None) or node.hasNsProp('locNoteRef', None) or node.hasNsProp('locNoteType', None): + if ( node.hasNsProp('locNote', None) or + node.hasNsProp('locNoteRef', None) or + node.hasNsProp('locNoteType', None) ): notetype = node.nsProp('locNoteType', None) if node.hasNsProp('locNote', None): ret.append(LocNote(locnote=node.nsProp('locNote', None), locnotetype=notetype)) @@ -1346,7 +1378,10 @@ ret.append(locnote) if (len(ret) == 0 and inherit and node.type != 'attribute' and node.parent is not None and node.parent.type == 'element'): - return self.get_its_loc_notes(node.parent) + parval = self.get_its_loc_notes(node.parent) + self._its_loc_notes_cache[node] = parval + return parval + self._its_loc_notes_cache[node] = ret return ret def output_test_data(self, category, out, node=None): @@ -1460,6 +1495,7 @@ return ret +#def main(): if __name__ == '__main__': options = optparse.OptionParser() options.set_usage('\n itstool [OPTIONS] [XMLFILES]\n' + @@ -1516,7 +1552,7 @@ help='Keep entity reference unexpanded') options.add_option('-p', '--param', action='append', - dest='params', + dest='userparams', default=[], nargs=2, metavar='NAME VALUE', @@ -1537,18 +1573,18 @@ print('itstool %s' % VERSION) sys.exit(0) - params = {} - for name, value in opts.params: - params[name] = value + userparams = {} + for name, value in opts.userparams: + userparams[name] = value if opts.merge is None and opts.join is None: messages = MessageList() for filename in args[1:]: doc = Document(filename, messages, load_dtd=opts.load_dtd, keep_entities=opts.keep_entities) - doc.apply_its_rules(not(opts.nobuiltins), params=params) + doc.apply_its_rules(not(opts.nobuiltins), userparams=userparams) if opts.itsfile is not None: for itsfile in opts.itsfile: - doc.apply_its_file(itsfile, params=params) + doc.apply_its_file(itsfile, userparams=userparams) if opts.test is None: doc.generate_messages() if opts.output is None or opts.output == '-': @@ -1590,10 +1626,10 @@ for filename in args[1:]: messages = MessageList() doc = Document(filename, messages, load_dtd=opts.load_dtd, keep_entities=opts.keep_entities) - doc.apply_its_rules(not(opts.nobuiltins), params=params) + doc.apply_its_rules(not(opts.nobuiltins), userparams=userparams) if opts.itsfile is not None: for itsfile in opts.itsfile: - doc.apply_its_file(itsfile, params=params) + doc.apply_its_file(itsfile, userparams=userparams) try: doc.merge_translations(translations, opts.lang, strict=opts.strict) except Exception as e: @@ -1634,10 +1670,10 @@ out = open(opts.output, 'wb') messages = MessageList() doc = Document(opts.join, messages) - doc.apply_its_rules(not(opts.nobuiltins), params=params) + doc.apply_its_rules(not(opts.nobuiltins), userparams=userparams) if opts.itsfile is not None: for itsfile in opts.itsfile: - doc.apply_its_file(itsfile, params=params) + doc.apply_its_file(itsfile, userparams=userparams) doc.join_translations(translations, strict=opts.strict) serialized = doc._doc.serialize('utf-8') if PY3: @@ -1646,3 +1682,10 @@ serialized = serialized.encode('utf-8') out.write(serialized) out.flush() + +#if __name__ == '__main__': +# if os.getenv('ITSTOOL_PROFILE') is not None: +# import cProfile +# cProfile.run('main()') +# else: +# main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/itstool-2.0.6/itstool.1 new/itstool-2.0.7/itstool.1 --- old/itstool-2.0.6/itstool.1 2019-04-06 20:39:20.000000000 +0200 +++ new/itstool-2.0.7/itstool.1 2021-09-25 17:10:05.000000000 +0200 @@ -1,4 +1,4 @@ -.TH "ITSTOOL" "1" "December 2013" "itstool 2.0.6" +.TH "ITSTOOL" "1" "December 2013" "itstool 2.0.7" .SH "NAME" itstool \- convert between XML and PO using ITS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/itstool-2.0.6/itstool.in new/itstool-2.0.7/itstool.in --- old/itstool-2.0.6/itstool.in 2018-11-08 19:11:00.000000000 +0100 +++ new/itstool-2.0.7/itstool.in 2021-05-25 17:43:33.000000000 +0200 @@ -554,6 +554,8 @@ self._itst_credits = None self._its_externals = {} + self._clear_cache() + def __del__ (self): self._doc.freeDoc() @@ -561,17 +563,27 @@ if self._xml_err: raise libxml2.parserError(self._xml_err) - def register_its_params(self, xpath, rules, params={}): + def _clear_cache(self): + self._its_translate_nodes_cache = {} + self._its_locale_filters_cache = {} + self._its_loc_notes_cache = {} + + def get_its_params(self, rules): + params = {} for child in xml_child_iter(rules): if xml_is_ns_name(child, NS_ITS, 'param'): - name = child.nsProp('name', None) - if name in params: - value = params[name] - else: - value = child.getContent() - xpath.xpathRegisterVariable(name, None, value) + params[child.nsProp('name', None)] = child.getContent() + return params + + def register_its_params(self, xpath, params, userparams={}): + for param in params: + if param in userparams: + xpath.xpathRegisterVariable(name, None, userparams[param]) + else: + xpath.xpathRegisterVariable(name, None, params[param]) def apply_its_rule(self, rule, xpath): + self._clear_cache() if rule.type != 'element': return if xml_is_ns_name(rule, NS_ITS, 'translateRule'): @@ -733,7 +745,8 @@ self._its_externals[node] = res[0].content xpath.setContextNode(oldnode) - def apply_its_rules(self, builtins, params={}): + def apply_its_rules(self, builtins, userparams={}): + self._clear_cache() if builtins: dirs = [] ddir = os.getenv('XDG_DATA_HOME', '') @@ -754,11 +767,12 @@ for dfile in os.listdir(itsdir): if dfile.endswith('.its'): if not ddone.get(dfile, False): - self.apply_its_file(os.path.join(itsdir, dfile), params=params) + self.apply_its_file(os.path.join(itsdir, dfile), userparams=userparams) ddone[dfile] = True - self.apply_local_its_rules(params=params) + self.apply_local_its_rules(userparams=userparams) - def apply_its_file(self, filename, params={}): + def apply_its_file(self, filename, userparams={}): + self._clear_cache() doc = libxml2.parseFile(filename) root = doc.getRootElement() if not xml_is_ns_name(root, NS_ITS, 'rules'): @@ -795,6 +809,7 @@ break if matched == False: return + params = self.get_its_params(root) for rule in xml_child_iter(root): xpath = self._doc.xpathNewContext() par = match @@ -808,10 +823,11 @@ xpath.xpathRegisterNs(nsdef.name, nsdef.content) nsdef = nsdef.next par = par.parent - self.register_its_params(xpath, root, params=params) + self.register_its_params(xpath, params, userparams=userparams) self.apply_its_rule(rule, xpath) - def apply_local_its_rules(self, params={}): + def apply_local_its_rules(self, userparams={}): + self._clear_cache() for rules in self._localrules: def reg_ns(xpath, node): if node.parent is not None: @@ -823,14 +839,15 @@ nsdef = nsdef.next xpath = self._doc.xpathNewContext() reg_ns(xpath, rules) - self.register_its_params(xpath, rules, params=params) + params = self.get_its_params(rules) + self.register_its_params(xpath, params, userparams=userparams) for rule in xml_child_iter(rules): if rule.type != 'element': continue if rule.nsDefs() is not None: rule_xpath = self._doc.xpathNewContext() reg_ns(rule_xpath, rule) - self.register_its_params(rule_xpath, rules, params=params) + self.register_its_params(rule_xpath, params, userparams=userparams) else: rule_xpath = xpath self.apply_its_rule(rule, rule_xpath) @@ -1111,7 +1128,7 @@ self.generate_message(child, None, comments=comments) break - def generate_message (self, node, msg, comments=True, path=None): + def generate_message(self, node, msg, comments=True, path=None): if node.type in ('text', 'cdata') and msg is not None: msg.add_text(node.content) return @@ -1261,6 +1278,8 @@ return False def get_its_translate(self, node): + if node in self._its_translate_nodes_cache: + return self._its_translate_nodes_cache[node] val = None if node.hasNsProp('translate', NS_ITS): val = node.nsProp('translate', NS_ITS) @@ -1269,11 +1288,14 @@ elif node in self._its_translate_nodes: val = self._its_translate_nodes[node] if val is not None: + self._its_translate_nodes_cache[node] = val return val if node.type == 'attribute': return 'no' if node.parent.type == 'element': - return self.get_its_translate(node.parent) + parval = self.get_its_translate(node.parent) + self._its_translate_nodes_cache[node] = parval + return parval return 'yes' def get_its_within_text(self, node): @@ -1288,6 +1310,8 @@ return 'no' def get_its_locale_filter(self, node): + if node in self._its_locale_filters_cache: + return self._its_locale_filters_cache[node] if node.hasNsProp('localeFilterList', NS_ITS) or node.hasNsProp('localeFilterType', NS_ITS): if node.hasNsProp('localeFilterList', NS_ITS): lst = node.nsProp('localeFilterList', NS_ITS) @@ -1312,7 +1336,9 @@ if node in self._its_locale_filters: return self._its_locale_filters[node] if node.parent.type == 'element': - return self.get_its_locale_filter(node.parent) + parval = self.get_its_locale_filter(node.parent) + self._its_locale_filters_cache[node] = parval + return parval return ('*', 'include') def get_itst_drop(self, node): @@ -1328,15 +1354,21 @@ return self._its_id_values.get(node, None) def get_its_loc_notes(self, node, inherit=True): + if node in self._its_loc_notes_cache: + return self._its_loc_notes_cache[node] ret = [] - if node.hasNsProp('locNote', NS_ITS) or node.hasNsProp('locNoteRef', NS_ITS) or node.hasNsProp('locNoteType', NS_ITS): + if ( node.hasNsProp('locNote', NS_ITS) or + node.hasNsProp('locNoteRef', NS_ITS) or + node.hasNsProp('locNoteType', NS_ITS) ): notetype = node.nsProp('locNoteType', NS_ITS) if node.hasNsProp('locNote', NS_ITS): ret.append(LocNote(locnote=node.nsProp('locNote', NS_ITS), locnotetype=notetype)) elif node.hasNsProp('locNoteRef', NS_ITS): ret.append(LocNote(locnoteref=node.nsProp('locNoteRef', NS_ITS), locnotetype=notetype)) elif xml_is_ns_name(node, NS_ITS, 'span'): - if node.hasNsProp('locNote', None) or node.hasNsProp('locNoteRef', None) or node.hasNsProp('locNoteType', None): + if ( node.hasNsProp('locNote', None) or + node.hasNsProp('locNoteRef', None) or + node.hasNsProp('locNoteType', None) ): notetype = node.nsProp('locNoteType', None) if node.hasNsProp('locNote', None): ret.append(LocNote(locnote=node.nsProp('locNote', None), locnotetype=notetype)) @@ -1346,7 +1378,10 @@ ret.append(locnote) if (len(ret) == 0 and inherit and node.type != 'attribute' and node.parent is not None and node.parent.type == 'element'): - return self.get_its_loc_notes(node.parent) + parval = self.get_its_loc_notes(node.parent) + self._its_loc_notes_cache[node] = parval + return parval + self._its_loc_notes_cache[node] = ret return ret def output_test_data(self, category, out, node=None): @@ -1460,6 +1495,7 @@ return ret +#def main(): if __name__ == '__main__': options = optparse.OptionParser() options.set_usage('\n itstool [OPTIONS] [XMLFILES]\n' + @@ -1516,7 +1552,7 @@ help='Keep entity reference unexpanded') options.add_option('-p', '--param', action='append', - dest='params', + dest='userparams', default=[], nargs=2, metavar='NAME VALUE', @@ -1537,18 +1573,18 @@ print('itstool %s' % VERSION) sys.exit(0) - params = {} - for name, value in opts.params: - params[name] = value + userparams = {} + for name, value in opts.userparams: + userparams[name] = value if opts.merge is None and opts.join is None: messages = MessageList() for filename in args[1:]: doc = Document(filename, messages, load_dtd=opts.load_dtd, keep_entities=opts.keep_entities) - doc.apply_its_rules(not(opts.nobuiltins), params=params) + doc.apply_its_rules(not(opts.nobuiltins), userparams=userparams) if opts.itsfile is not None: for itsfile in opts.itsfile: - doc.apply_its_file(itsfile, params=params) + doc.apply_its_file(itsfile, userparams=userparams) if opts.test is None: doc.generate_messages() if opts.output is None or opts.output == '-': @@ -1590,10 +1626,10 @@ for filename in args[1:]: messages = MessageList() doc = Document(filename, messages, load_dtd=opts.load_dtd, keep_entities=opts.keep_entities) - doc.apply_its_rules(not(opts.nobuiltins), params=params) + doc.apply_its_rules(not(opts.nobuiltins), userparams=userparams) if opts.itsfile is not None: for itsfile in opts.itsfile: - doc.apply_its_file(itsfile, params=params) + doc.apply_its_file(itsfile, userparams=userparams) try: doc.merge_translations(translations, opts.lang, strict=opts.strict) except Exception as e: @@ -1634,10 +1670,10 @@ out = open(opts.output, 'wb') messages = MessageList() doc = Document(opts.join, messages) - doc.apply_its_rules(not(opts.nobuiltins), params=params) + doc.apply_its_rules(not(opts.nobuiltins), userparams=userparams) if opts.itsfile is not None: for itsfile in opts.itsfile: - doc.apply_its_file(itsfile, params=params) + doc.apply_its_file(itsfile, userparams=userparams) doc.join_translations(translations, strict=opts.strict) serialized = doc._doc.serialize('utf-8') if PY3: @@ -1646,3 +1682,10 @@ serialized = serialized.encode('utf-8') out.write(serialized) out.flush() + +#if __name__ == '__main__': +# if os.getenv('ITSTOOL_PROFILE') is not None: +# import cProfile +# cProfile.run('main()') +# else: +# main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/itstool-2.0.6/missing new/itstool-2.0.7/missing --- old/itstool-2.0.6/missing 2019-04-06 20:39:19.000000000 +0200 +++ new/itstool-2.0.7/missing 2021-09-25 17:10:04.000000000 +0200 @@ -1,9 +1,9 @@ -#!/bin/sh +#! /bin/sh # Common wrapper for a few potentially missing GNU programs. -scriptversion=2016-01-11.22; # UTC +scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# Copyright (C) 1996-2020 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard <pin...@iro.umontreal.ca>, 1996. # This program is free software; you can redistribute it and/or modify @@ -17,7 +17,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. +# along with this program. If not, see <https://www.gnu.org/licenses/>. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -101,9 +101,9 @@ exit $st fi -perl_URL=http://www.perl.org/ -flex_URL=http://flex.sourceforge.net/ -gnu_software_URL=http://www.gnu.org/software +perl_URL=https://www.perl.org/ +flex_URL=https://github.com/westes/flex +gnu_software_URL=https://www.gnu.org/software program_details () { @@ -207,7 +207,7 @@ exit $st # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/itstool-2.0.6/setup.py new/itstool-2.0.7/setup.py --- old/itstool-2.0.6/setup.py 2019-04-06 20:39:20.000000000 +0200 +++ new/itstool-2.0.7/setup.py 2021-09-25 17:10:05.000000000 +0200 @@ -8,7 +8,7 @@ from distutils.core import setup setup(name='itstool', - version='2.0.6', + version='2.0.7', description='XML to PO and back again using W3C ITS rules', author='Shaun McCance', author_email='sha...@gnome.org',