Hello community, here is the log from the commit of package gnu_parallel for openSUSE:Factory checked in at 2020-11-02 10:36:37 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gnu_parallel (Old) and /work/SRC/openSUSE:Factory/.gnu_parallel.new.3463 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gnu_parallel" Mon Nov 2 10:36:37 2020 rev:60 rq:845305 version:20201022 Changes: -------- --- /work/SRC/openSUSE:Factory/gnu_parallel/gnu_parallel.changes 2020-10-10 19:05:18.156513162 +0200 +++ /work/SRC/openSUSE:Factory/.gnu_parallel.new.3463/gnu_parallel.changes 2020-11-02 10:36:52.555316557 +0100 @@ -1,0 +2,6 @@ +Sun Nov 1 23:14:53 UTC 2020 - Jan Engelhardt <jeng...@inai.de> + +- Update to release 20201022 + * --termseq now works for jobs running remotely. + +------------------------------------------------------------------- Old: ---- parallel-20200922.tar.bz2 parallel-20200922.tar.bz2.sig New: ---- parallel-20201022.tar.bz2 parallel-20201022.tar.bz2.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gnu_parallel.spec ++++++ --- /var/tmp/diff_new_pack.OPd8z6/_old 2020-11-02 10:36:53.235317024 +0100 +++ /var/tmp/diff_new_pack.OPd8z6/_new 2020-11-02 10:36:53.239317026 +0100 @@ -17,7 +17,7 @@ Name: gnu_parallel -Version: 20200922 +Version: 20201022 Release: 0 Summary: Shell tool for executing jobs in parallel License: GPL-3.0-or-later ++++++ parallel-20200922.tar.bz2 -> parallel-20201022.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/NEWS new/parallel-20201022/NEWS --- old/parallel-20200922/NEWS 2020-09-23 10:05:20.000000000 +0200 +++ new/parallel-20201022/NEWS 2020-10-22 21:51:52.000000000 +0200 @@ -1,3 +1,20 @@ +20201022 + +* --termseq now works for jobs running remotely. + +* parsort: Performance optimized for 64-core machines. + +* Bug fixes and man page updates. + +News about GNU Parallel: + +* Juan Sierra Pons has made a testimonial: + http://www.elsotanillo.net/wp-content/uploads/GnuParallel_JuanSierraPons.mp4 + +* 「翻译」在生物信息学中使用 GNU-Parallel + https://cloud.tencent.com/developer/article/1705499 + + 20200922 * New CPU detection for GNU/Linux. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/README new/parallel-20201022/README --- old/parallel-20200922/README 2020-09-23 10:09:33.000000000 +0200 +++ new/parallel-20201022/README 2020-10-22 22:00:30.000000000 +0200 @@ -40,13 +40,13 @@ $ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \ fetch -o - http://pi.dk/3 ) > install.sh - $ sha1sum install.sh | grep 3374ec53bacb199b245af2dda86df6c9 - 12345678 3374ec53 bacb199b 245af2dd a86df6c9 - $ md5sum install.sh | grep 029a9ac06e8b5bc6052eac57b2c3c9ca - 029a9ac0 6e8b5bc6 052eac57 b2c3c9ca - $ sha512sum install.sh | grep f517006d9897747bed8a4694b1acba1b - 40f53af6 9e20dae5 713ba06c f517006d 9897747b ed8a4694 b1acba1b 1464beb4 - 60055629 3f2356f3 3e9c4e3c 76e3f3af a9db4b32 bd33322b 975696fc e6b23cfb + $ sha1sum install.sh | grep 67bd7bc7dc20aff99eb8f1266574dadb + 12345678 67bd7bc7 dc20aff9 9eb8f126 6574dadb + $ md5sum install.sh | grep b7a15cdbb07fb6e11b0338577bc1780f + b7a15cdb b07fb6e1 1b033857 7bc1780f + $ sha512sum install.sh | grep 186000b62b66969d7506ca4f885e0c80e02a22444 + 6f25960b d4b90cf6 ba5b76de c1acdf39 f3d24249 72930394 a4164351 93a7668d + 21ff9839 6f920be5 186000b6 2b66969d 7506ca4f 885e0c80 e02a2244 40e8a43f $ bash install.sh This will literally install faster than reading the rest of this @@ -57,11 +57,11 @@ Full installation of GNU Parallel is as simple as: - wget https://ftpmirror.gnu.org/parallel/parallel-20200922.tar.bz2 - wget https://ftpmirror.gnu.org/parallel/parallel-20200922.tar.bz2.sig - gpg parallel-20200922.tar.bz2.sig - bzip2 -dc parallel-20200922.tar.bz2 | tar xvf - - cd parallel-20200922 + wget https://ftpmirror.gnu.org/parallel/parallel-20201022.tar.bz2 + wget https://ftpmirror.gnu.org/parallel/parallel-20201022.tar.bz2.sig + gpg parallel-20201022.tar.bz2.sig + bzip2 -dc parallel-20201022.tar.bz2 | tar xvf - + cd parallel-20201022 ./configure && make && sudo make install @@ -70,11 +70,11 @@ If you are not root you can add ~/bin to your path and install in ~/bin and ~/share: - wget https://ftpmirror.gnu.org/parallel/parallel-20200922.tar.bz2 - wget https://ftpmirror.gnu.org/parallel/parallel-20200922.tar.bz2.sig - gpg parallel-20200922.tar.bz2.sig - bzip2 -dc parallel-20200922.tar.bz2 | tar xvf - - cd parallel-20200922 + wget https://ftpmirror.gnu.org/parallel/parallel-20201022.tar.bz2 + wget https://ftpmirror.gnu.org/parallel/parallel-20201022.tar.bz2.sig + gpg parallel-20201022.tar.bz2.sig + bzip2 -dc parallel-20201022.tar.bz2 | tar xvf - + cd parallel-20201022 ./configure --prefix=$HOME && make && make install Or if your system lacks 'make' you can simply copy src/parallel @@ -122,8 +122,8 @@ When using programs that use GNU Parallel to process data for publication please cite: - Tange, O. (2020, September 22). GNU Parallel 20200922 ('Ginsburg'). - Zenodo. https://doi.org/10.5281/zenodo.4045386 + Tange, O. (2020, October 22). GNU Parallel 20201022 ('SamuelPaty'). + Zenodo. https://doi.org/10.5281/zenodo.4118697 Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Ole Tange, http://ole.tange.dk and Free diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/configure new/parallel-20201022/configure --- old/parallel-20200922/configure 2020-09-23 10:09:59.000000000 +0200 +++ new/parallel-20201022/configure 2020-10-22 22:02:45.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for parallel 20200922. +# Generated by GNU Autoconf 2.69 for parallel 20201022. # # Report bugs to <bug-paral...@gnu.org>. # @@ -579,8 +579,8 @@ # Identity of this package. PACKAGE_NAME='parallel' PACKAGE_TARNAME='parallel' -PACKAGE_VERSION='20200922' -PACKAGE_STRING='parallel 20200922' +PACKAGE_VERSION='20201022' +PACKAGE_STRING='parallel 20201022' PACKAGE_BUGREPORT='bug-paral...@gnu.org' PACKAGE_URL='' @@ -1214,7 +1214,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 parallel 20200922 to adapt to many kinds of systems. +\`configure' configures parallel 20201022 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1281,7 +1281,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of parallel 20200922:";; + short | recursive ) echo "Configuration of parallel 20201022:";; esac cat <<\_ACEOF @@ -1357,7 +1357,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -parallel configure 20200922 +parallel configure 20201022 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1374,7 +1374,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by parallel $as_me 20200922, which was +It was created by parallel $as_me 20201022, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2237,7 +2237,7 @@ # Define the identity of the package. PACKAGE='parallel' - VERSION='20200922' + VERSION='20201022' cat >>confdefs.h <<_ACEOF @@ -2880,7 +2880,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by parallel $as_me 20200922, which was +This file was extended by parallel $as_me 20201022, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -2942,7 +2942,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -parallel config.status 20200922 +parallel config.status 20201022 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/parallel-20200922/configure.ac new/parallel-20201022/configure.ac --- old/parallel-20200922/configure.ac 2020-09-23 10:09:33.000000000 +0200 +++ new/parallel-20201022/configure.ac 2020-10-22 22:00:30.000000000 +0200 @@ -1,4 +1,4 @@ -AC_INIT([parallel], [20200922], [bug-paral...@gnu.org]) +AC_INIT([parallel], [20201022], [bug-paral...@gnu.org]) AM_INIT_AUTOMAKE([-Wall -Werror foreign]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/env_parallel.1 new/parallel-20201022/src/env_parallel.1 --- old/parallel-20200922/src/env_parallel.1 2020-09-19 17:06:59.000000000 +0200 +++ new/parallel-20201022/src/env_parallel.1 2020-10-22 22:02:48.000000000 +0200 @@ -133,7 +133,7 @@ .\" ======================================================================== .\" .IX Title "ENV_PARALLEL 1" -.TH ENV_PARALLEL 1 "2020-09-18" "20200822" "parallel" +.TH ENV_PARALLEL 1 "2020-10-22" "20201022" "parallel" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/env_parallel.ash new/parallel-20201022/src/env_parallel.ash --- old/parallel-20200922/src/env_parallel.ash 2020-01-27 18:17:31.000000000 +0100 +++ new/parallel-20201022/src/env_parallel.ash 2020-10-22 22:00:30.000000000 +0200 @@ -374,6 +374,28 @@ echo parset: Error: ' ' parset myarray echo ::: foo bar >&2 return 255 fi + if [ "$_parset_NAME" = "--help" ] ; then + echo parset: Error: Usage: >&2 + echo parset: Error: ' ' parset varname GNU Parallel options and command >&2 + echo + parallel --help + return 255 + fi + if [ "$_parset_NAME" = "--version" ] ; then + echo "parset 20201022 (GNU parallel `parallel --minversion 1`)" + echo "Copyright (C) 2007-2020 Ole Tange, http://ole.tange.dk and Free Software" + echo "Foundation, Inc." + echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>" + echo "This is free software: you are free to change and redistribute it." + echo "GNU parallel comes with no warranty." + echo + echo "Web site: https://www.gnu.org/software/parallel" + echo + echo "When using programs that use GNU Parallel to process data for publication" + echo "please cite as described in 'parallel --citation'." + echo + return 255 + fi shift echo "$_parset_NAME" | perl -ne 'chomp;for (split /[, ]/) { @@ -381,6 +403,8 @@ if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) { print STDERR "parset: Error: $_ is an invalid variable name.\n"; print STDERR "parset: Error: Variable names must be letter followed by letters or digits.\n"; + print STDERR "parset: Error: Usage:\n"; + print STDERR "parset: Error: parset varname GNU Parallel options and command\n"; $exitval = 255; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/env_parallel.bash new/parallel-20201022/src/env_parallel.bash --- old/parallel-20200922/src/env_parallel.bash 2020-07-04 10:45:58.000000000 +0200 +++ new/parallel-20201022/src/env_parallel.bash 2020-10-22 22:00:30.000000000 +0200 @@ -208,7 +208,7 @@ # Grep regexp for vars given by --env _grep_REGEXP="`_make_grep_REGEXP \"$@\"`" unset _make_grep_REGEXP - + # Deal with --env _ _ignore_UNDERSCORE="`_get_ignored_VARS \"$@\"`" unset _get_ignored_VARS @@ -376,6 +376,28 @@ echo parset: Error: ' ' parset myarray echo ::: foo bar >&2 return 255 fi + if [ "$_parset_NAME" = "--help" ] ; then + echo parset: Error: Usage: >&2 + echo parset: Error: ' ' parset varname GNU Parallel options and command >&2 + echo + parallel --help + return 255 + fi + if [ "$_parset_NAME" = "--version" ] ; then + echo "parset 20201022 (GNU parallel `parallel --minversion 1`)" + echo "Copyright (C) 2007-2020 Ole Tange, http://ole.tange.dk and Free Software" + echo "Foundation, Inc." + echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>" + echo "This is free software: you are free to change and redistribute it." + echo "GNU parallel comes with no warranty." + echo + echo "Web site: https://www.gnu.org/software/parallel" + echo + echo "When using programs that use GNU Parallel to process data for publication" + echo "please cite as described in 'parallel --citation'." + echo + return 255 + fi shift echo "$_parset_NAME" | perl -ne 'chomp;for (split /[, ]/) { @@ -383,6 +405,8 @@ if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) { print STDERR "parset: Error: $_ is an invalid variable name.\n"; print STDERR "parset: Error: Variable names must be letter followed by letters or digits.\n"; + print STDERR "parset: Error: Usage:\n"; + print STDERR "parset: Error: parset varname GNU Parallel options and command\n"; $exitval = 255; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/env_parallel.csh new/parallel-20201022/src/env_parallel.csh --- old/parallel-20200922/src/env_parallel.csh 2020-01-27 18:17:31.000000000 +0100 +++ new/parallel-20201022/src/env_parallel.csh 2020-10-22 22:01:43.000000000 +0200 @@ -83,7 +83,7 @@ # Make a tmpfile for the variable definitions + alias set _tMpaLLfILe=`_tempfile` foreach _vARnAmE ($_vARnAmES); - # These 3 lines break in csh version 20110502-3 + # These 3 lines break in csh ver. 20110502-3 # if not defined: next eval if'(! $?'$_vARnAmE') continue' # if $#myvar <= 1 echo scalar_myvar=$var diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/env_parallel.dash new/parallel-20201022/src/env_parallel.dash --- old/parallel-20200922/src/env_parallel.dash 2020-01-27 18:17:31.000000000 +0100 +++ new/parallel-20201022/src/env_parallel.dash 2020-10-22 22:00:30.000000000 +0200 @@ -216,7 +216,7 @@ # Grep regexp for vars given by --env _grep_REGEXP="`_make_grep_REGEXP \"$@\"`" unset _make_grep_REGEXP - + # Deal with --env _ _ignore_UNDERSCORE="`_get_ignored_VARS \"$@\"`" unset _get_ignored_VARS @@ -374,6 +374,28 @@ echo parset: Error: ' ' parset myarray echo ::: foo bar >&2 return 255 fi + if [ "$_parset_NAME" = "--help" ] ; then + echo parset: Error: Usage: >&2 + echo parset: Error: ' ' parset varname GNU Parallel options and command >&2 + echo + parallel --help + return 255 + fi + if [ "$_parset_NAME" = "--version" ] ; then + echo "parset 20201022 (GNU parallel `parallel --minversion 1`)" + echo "Copyright (C) 2007-2020 Ole Tange, http://ole.tange.dk and Free Software" + echo "Foundation, Inc." + echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>" + echo "This is free software: you are free to change and redistribute it." + echo "GNU parallel comes with no warranty." + echo + echo "Web site: https://www.gnu.org/software/parallel" + echo + echo "When using programs that use GNU Parallel to process data for publication" + echo "please cite as described in 'parallel --citation'." + echo + return 255 + fi shift echo "$_parset_NAME" | perl -ne 'chomp;for (split /[, ]/) { @@ -381,6 +403,8 @@ if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) { print STDERR "parset: Error: $_ is an invalid variable name.\n"; print STDERR "parset: Error: Variable names must be letter followed by letters or digits.\n"; + print STDERR "parset: Error: Usage:\n"; + print STDERR "parset: Error: parset varname GNU Parallel options and command\n"; $exitval = 255; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/env_parallel.ksh new/parallel-20201022/src/env_parallel.ksh --- old/parallel-20200922/src/env_parallel.ksh 2020-01-27 18:17:31.000000000 +0100 +++ new/parallel-20201022/src/env_parallel.ksh 2020-10-22 22:00:30.000000000 +0200 @@ -199,7 +199,7 @@ # Grep regexp for vars given by --env _grep_REGEXP="`_make_grep_REGEXP \"$@\"`" unset _make_grep_REGEXP - + # Deal with --env _ _ignore_UNDERSCORE="`_get_ignored_VARS \"$@\"`" unset _get_ignored_VARS @@ -357,6 +357,28 @@ echo parset: Error: ' ' parset myarray echo ::: foo bar >&2 return 255 fi + if [ "$_parset_NAME" = "--help" ] ; then + echo parset: Error: Usage: >&2 + echo parset: Error: ' ' parset varname GNU Parallel options and command >&2 + echo + parallel --help + return 255 + fi + if [ "$_parset_NAME" = "--version" ] ; then + echo "parset 20201022 (GNU parallel `parallel --minversion 1`)" + echo "Copyright (C) 2007-2020 Ole Tange, http://ole.tange.dk and Free Software" + echo "Foundation, Inc." + echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>" + echo "This is free software: you are free to change and redistribute it." + echo "GNU parallel comes with no warranty." + echo + echo "Web site: https://www.gnu.org/software/parallel" + echo + echo "When using programs that use GNU Parallel to process data for publication" + echo "please cite as described in 'parallel --citation'." + echo + return 255 + fi shift echo "$_parset_NAME" | perl -ne 'chomp;for (split /[, ]/) { @@ -364,6 +386,8 @@ if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) { print STDERR "parset: Error: $_ is an invalid variable name.\n"; print STDERR "parset: Error: Variable names must be letter followed by letters or digits.\n"; + print STDERR "parset: Error: Usage:\n"; + print STDERR "parset: Error: parset varname GNU Parallel options and command\n"; $exitval = 255; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/env_parallel.mksh new/parallel-20201022/src/env_parallel.mksh --- old/parallel-20200922/src/env_parallel.mksh 2020-01-27 18:17:31.000000000 +0100 +++ new/parallel-20201022/src/env_parallel.mksh 2020-10-22 22:00:30.000000000 +0200 @@ -202,7 +202,7 @@ # Grep regexp for vars given by --env _grep_REGEXP="`_make_grep_REGEXP \"$@\"`" unset _make_grep_REGEXP - + # Deal with --env _ _ignore_UNDERSCORE="`_get_ignored_VARS \"$@\"`" unset _get_ignored_VARS @@ -360,6 +360,28 @@ echo parset: Error: ' ' parset myarray echo ::: foo bar >&2 return 255 fi + if [ "$_parset_NAME" = "--help" ] ; then + echo parset: Error: Usage: >&2 + echo parset: Error: ' ' parset varname GNU Parallel options and command >&2 + echo + parallel --help + return 255 + fi + if [ "$_parset_NAME" = "--version" ] ; then + echo "parset 20201022 (GNU parallel `parallel --minversion 1`)" + echo "Copyright (C) 2007-2020 Ole Tange, http://ole.tange.dk and Free Software" + echo "Foundation, Inc." + echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>" + echo "This is free software: you are free to change and redistribute it." + echo "GNU parallel comes with no warranty." + echo + echo "Web site: https://www.gnu.org/software/parallel" + echo + echo "When using programs that use GNU Parallel to process data for publication" + echo "please cite as described in 'parallel --citation'." + echo + return 255 + fi shift echo "$_parset_NAME" | perl -ne 'chomp;for (split /[, ]/) { @@ -367,6 +389,8 @@ if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) { print STDERR "parset: Error: $_ is an invalid variable name.\n"; print STDERR "parset: Error: Variable names must be letter followed by letters or digits.\n"; + print STDERR "parset: Error: Usage:\n"; + print STDERR "parset: Error: parset varname GNU Parallel options and command\n"; $exitval = 255; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/env_parallel.sh new/parallel-20201022/src/env_parallel.sh --- old/parallel-20200922/src/env_parallel.sh 2020-01-27 18:17:31.000000000 +0100 +++ new/parallel-20201022/src/env_parallel.sh 2020-10-22 22:00:30.000000000 +0200 @@ -216,7 +216,7 @@ # Grep regexp for vars given by --env _grep_REGEXP="`_make_grep_REGEXP \"$@\"`" unset _make_grep_REGEXP - + # Deal with --env _ _ignore_UNDERSCORE="`_get_ignored_VARS \"$@\"`" unset _get_ignored_VARS @@ -374,6 +374,28 @@ echo parset: Error: ' ' parset myarray echo ::: foo bar >&2 return 255 fi + if [ "$_parset_NAME" = "--help" ] ; then + echo parset: Error: Usage: >&2 + echo parset: Error: ' ' parset varname GNU Parallel options and command >&2 + echo + parallel --help + return 255 + fi + if [ "$_parset_NAME" = "--version" ] ; then + echo "parset 20201022 (GNU parallel `parallel --minversion 1`)" + echo "Copyright (C) 2007-2020 Ole Tange, http://ole.tange.dk and Free Software" + echo "Foundation, Inc." + echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>" + echo "This is free software: you are free to change and redistribute it." + echo "GNU parallel comes with no warranty." + echo + echo "Web site: https://www.gnu.org/software/parallel" + echo + echo "When using programs that use GNU Parallel to process data for publication" + echo "please cite as described in 'parallel --citation'." + echo + return 255 + fi shift echo "$_parset_NAME" | perl -ne 'chomp;for (split /[, ]/) { @@ -381,6 +403,8 @@ if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) { print STDERR "parset: Error: $_ is an invalid variable name.\n"; print STDERR "parset: Error: Variable names must be letter followed by letters or digits.\n"; + print STDERR "parset: Error: Usage:\n"; + print STDERR "parset: Error: parset varname GNU Parallel options and command\n"; $exitval = 255; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/env_parallel.tcsh new/parallel-20201022/src/env_parallel.tcsh --- old/parallel-20200922/src/env_parallel.tcsh 2020-01-27 18:17:31.000000000 +0100 +++ new/parallel-20201022/src/env_parallel.tcsh 2020-10-22 22:00:30.000000000 +0200 @@ -83,7 +83,7 @@ # Make a tmpfile for the variable definitions + alias set _tMpaLLfILe=`_tempfile` foreach _vARnAmE ($_vARnAmES); - # These 3 lines break in csh version 20110502-3 + # These 3 lines break in csh version 20201022-3 # if not defined: next eval if'(! $?'$_vARnAmE') continue' # if $#myvar <= 1 echo scalar_myvar=$var diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/env_parallel.zsh new/parallel-20201022/src/env_parallel.zsh --- old/parallel-20200922/src/env_parallel.zsh 2020-01-27 18:17:31.000000000 +0100 +++ new/parallel-20201022/src/env_parallel.zsh 2020-10-22 22:00:30.000000000 +0200 @@ -193,7 +193,7 @@ # Grep regexp for vars given by --env _grep_REGEXP="`_make_grep_REGEXP \"$@\"`" unset _make_grep_REGEXP - + # Deal with --env _ _ignore_UNDERSCORE="`_get_ignored_VARS \"$@\"`" unset _get_ignored_VARS @@ -351,6 +351,28 @@ echo parset: Error: ' ' parset myarray echo ::: foo bar >&2 return 255 fi + if [ "$_parset_NAME" = "--help" ] ; then + echo parset: Error: Usage: >&2 + echo parset: Error: ' ' parset varname GNU Parallel options and command >&2 + echo + parallel --help + return 255 + fi + if [ "$_parset_NAME" = "--version" ] ; then + echo "parset 20201022 (GNU parallel `parallel --minversion 1`)" + echo "Copyright (C) 2007-2020 Ole Tange, http://ole.tange.dk and Free Software" + echo "Foundation, Inc." + echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>" + echo "This is free software: you are free to change and redistribute it." + echo "GNU parallel comes with no warranty." + echo + echo "Web site: https://www.gnu.org/software/parallel" + echo + echo "When using programs that use GNU Parallel to process data for publication" + echo "please cite as described in 'parallel --citation'." + echo + return 255 + fi shift echo "$_parset_NAME" | perl -ne 'chomp;for (split /[, ]/) { @@ -358,6 +380,8 @@ if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) { print STDERR "parset: Error: $_ is an invalid variable name.\n"; print STDERR "parset: Error: Variable names must be letter followed by letters or digits.\n"; + print STDERR "parset: Error: Usage:\n"; + print STDERR "parset: Error: parset varname GNU Parallel options and command\n"; $exitval = 255; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/niceload new/parallel-20201022/src/niceload --- old/parallel-20200922/src/niceload 2020-09-23 10:09:33.000000000 +0200 +++ new/parallel-20201022/src/niceload 2020-10-22 22:00:30.000000000 +0200 @@ -23,7 +23,7 @@ use strict; use Getopt::Long; $Global::progname="niceload"; -$Global::version = 20200922; +$Global::version = 20201022; Getopt::Long::Configure("bundling","require_order"); get_options_from_array(\@ARGV) || die_usage(); if($opt::version) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/parallel new/parallel-20201022/src/parallel --- old/parallel-20200922/src/parallel 2020-09-23 10:09:33.000000000 +0200 +++ new/parallel-20201022/src/parallel 2020-10-22 22:00:30.000000000 +0200 @@ -881,16 +881,17 @@ # Numbered 0..n-1 due to being used by $F[n] if($group_by::col) { $group_by::col--; } - my $loop = ::spacefree(0,'{ - local $_=COLVALUE; - PERLEXPR; - if(! defined $last) { $last = $_ } - if(($last) ne $_) { - print "RECSEP"; - $last = $_; + my $loop = ::spacefree(0,q{ + BEGIN{ $last = "RECSEP"; } + { + local $_=COLVALUE; + PERLEXPR; + if(($last) ne $_) { + print "RECSEP"; + $last = $_; + } } - }'); - + }); if(defined $group_by::col) { $loop =~ s/COLVALUE/\$F[$group_by::col]/g; } else { @@ -2086,6 +2087,9 @@ $Global::sql = SQL->new($opt::sqlmaster || $opt::sqlworker); } if($opt::sqlworker) { $Global::membuffer ||= 1; } + # The sqlmaster groups the arguments, so the should just read one + if($opt::sqlworker and not $opt::sqlmaster) { $Global::max_number_of_args = 1; } + } sub check_invalid_option_combinations() { @@ -2160,7 +2164,7 @@ sub init_globals() { # Defaults: - $Global::version = 20200922; + $Global::version = 20201022; $Global::progname = 'parallel'; $::name = "GNU Parallel"; $Global::infinity = 2**31; @@ -3902,7 +3906,9 @@ return undef; } } - $job->set_sshlogin($sshlogin); + if(not $job->suspended()) { + $job->set_sshlogin($sshlogin); + } if($opt::retries and $job->failed_here()) { # This command with these args failed for this sshlogin my ($no_of_failed_sshlogins,$min_failures) = $job->min_failed(); @@ -4525,6 +4531,7 @@ # -P should only go to the first, and -S should not be copied at all. my $options = join(" ", + ((defined $opt::sshdelay) ? "--delay ".$opt::sshdelay : ""), ((defined $opt::memfree) ? "--memfree ".$opt::memfree : ""), ((defined $opt::memsuspend) ? "--memfree ".$opt::memsuspend : ""), ((defined $opt::D) ? "-D $opt::D" : ""), @@ -4539,6 +4546,7 @@ ); my $suboptions = join(" ", + ((defined $opt::sshdelay) ? "--delay ".$opt::sshdelay : ""), ((defined $opt::D) ? "-D $opt::D" : ""), ((defined $opt::arg_file_sep) ? "--arg-file-sep ".$opt::arg_file_sep : ""), ((defined $opt::arg_sep) ? "--arg-sep ".$opt::arg_sep : ""), @@ -4554,6 +4562,7 @@ ((defined $opt::retries) ? "--retries ".$opt::retries : ""), ((defined $opt::timeout) ? "--timeout ".$opt::timeout : ""), ((defined $opt::ungroup) ? "-u" : ""), + ((defined $opt::ssh) ? "--ssh '".$opt::ssh."'" : ""), ((defined $opt::tee) ? "--tee" : ""), ((defined $opt::workdir) ? "--wd ".Q($opt::workdir) : ""), (@Global::transfer_files ? map { "--tf ".Q($_) } @@ -4808,12 +4817,8 @@ # Convert pids to process groups ($processgroup = -$pid) my @pgrps = map { -$_ } @_; my @term_seq = split/,/,$opt::termseq; - if($opt::memsuspend) { - @term_seq = ("STOP",1); - } else { - if(not @term_seq) { - @term_seq = ("TERM",200,"TERM",100,"TERM",50,"KILL",25); - } + if(not @term_seq) { + @term_seq = ("TERM",200,"TERM",100,"TERM",50,"KILL",25); } while(@term_seq) { @pgrps = kill_sleep(shift @term_seq, shift @term_seq, @pgrps); @@ -4913,14 +4918,14 @@ "--recend str Record end separator for --pipe.", "--recstart str Record start separator for --pipe.", "", - "See 'man $Global::progname' for details", + "GNU Parallel can do much more. See 'man $Global::progname' for details", "", "Academic tradition requires you to cite works you base your article on.", "If you use programs that use GNU Parallel to process data for an article in a", "scientific publication, please cite:", "", - " Tange, O. (2020, September 22). GNU Parallel 20200922 ('Ginsburg').", - " Zenodo. https://doi.org/10.5281/zenodo.4045386", + " Tange, O. (2020, October 22). GNU Parallel 20201022 ('SamuelPaty').", + " Zenodo. https://doi.org/10.5281/zenodo.4118697", "", # Before changing this line, please read # https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice @@ -4950,8 +4955,8 @@ "If you use programs that use GNU Parallel to process data for an article in a", "scientific publication, please cite:", "", - " Tange, O. (2020, September 22). GNU Parallel 20200922 ('Ginsburg').", - " Zenodo. https://doi.org/10.5281/zenodo.4045386", + " Tange, O. (2020, October 22). GNU Parallel 20201022 ('SamuelPaty').", + " Zenodo. https://doi.org/10.5281/zenodo.4118697", "", # Before changing this line, please read # https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice and @@ -5064,20 +5069,20 @@ "If you use programs that use GNU Parallel to process data for an article in a", "scientific publication, please cite:", "", - "\@software{tange_2020_4045386,", + "\@software{tange_2020_4118697,", " author = {Tange, Ole},", - " title = {GNU Parallel 20200922 ('Ginsburg')},", - " month = Sep,", + " title = {GNU Parallel 20201022 ('SamuelPaty')},", + " month = Oct,", " year = 2020,", " note = {{GNU Parallel is a general parallelizer to run", " multiple serial command line programs in parallel", " without changing them.}},", " publisher = {Zenodo},", - " doi = {10.5281/zenodo.4045386},", - " url = {https://doi.org/10.5281/zenodo.4045386}", + " doi = {10.5281/zenodo.4118697},", + " url = {https://doi.org/10.5281/zenodo.4118697}", "}", "", - "(Feel free to use \\nocite{tange_2020_4045386})", + "(Feel free to use \\nocite{tange_2020_4118697})", "", # Before changing this line, please read # https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice and @@ -5972,13 +5977,17 @@ @{$jobs_of{$sshlogin}})); ::debug("mem","\n", $job->seq(), "killed ", $sshlogin->memfree()," < ",$limit); - $job->kill(); + if($opt::memsuspend) { + $job->suspend(); + } else { + $job->kill(); + } $sshlogin->memfree_recompute(); } else { last; } } - ::debug("mem","Free mem OK ", + ::debug("mem","Free mem OK? ", $sshlogin->memfree()," > ",$limit); } } @@ -8626,11 +8635,15 @@ my $self = shift; $self->set_exitstatus(-1); ::kill_sleep_seq($self->pid()); +} + +sub suspend($) { + my $self = shift; + my @pgrps = map { -$_ } $self->pid(); + kill "STOP", @pgrps; + $self->set_suspended(1); # push job onto start stack - if($opt::memsuspend) { - $self->{'suspended'} = 1; - $Global::JobQueue->{'commandlinequeue'}->unget($self); - } + $Global::JobQueue->unget($self); } sub set_suspended($$) { @@ -8643,6 +8656,13 @@ return $self->{'suspended'}; } +sub resume($) { + my $self = shift; + my @pgrps = map { -$_ } $self->pid(); + kill "CONT", @pgrps; + $self->set_suspended(0); +} + sub failed($) { # return number of times failed for this $sshlogin # Input: @@ -9058,6 +9078,7 @@ ::spacefree(0,'$shell = "'.($ENV{'PARALLEL_SHELL'} || '$ENV{SHELL}').'";'. '$tmpdir = "'.::perl_quote_scalar($ENV{'TMPDIR'}).'";'. '$nice = '.$opt::nice.';'. + '$termseq = "'.$opt::termseq.'";'. q{ # Set $PARALLEL_TMP to a non-existent file name in $TMPDIR do { @@ -9079,8 +9100,17 @@ $s = $s < 1 ? 0.001 + $s * 1.03 : $s; select(undef, undef, undef, $s); } until ($done || getppid == 1); - # Kill HUP the process group if job not done - kill(SIGHUP, -${pid}) unless $done; + if(not $done) { + # Kill as per --termseq + my @term_seq = split/,/,$termseq; + if(not @term_seq) { + @term_seq = ("TERM",200,"TERM",100,"TERM",50,"KILL",25); + } + while(@term_seq && kill(0,-$pid)) { + kill(shift @term_seq, -$pid); + select(undef, undef, undef, (shift @term_seq)/1000); + } + } wait; exit ($?&127 ? 128+($?&127) : 1+$?>>8) }); @@ -9647,7 +9677,7 @@ my $job = shift; if($job->suspended()) { # Job is kill -STOP'ped: Restart it. - kill "CONT", $job->pid(); + $job->resume(); return $job; } # Get the shell command to be executed (possibly with ssh infront). @@ -10330,7 +10360,7 @@ $cmd = $self->replaced(); } else { # Verbose level > 1: Print the rsync and stuff - $cmd = join " ", @{$self->{'commandline'}}; + $cmd = $self->wrapped(); } # Newlines make it hard to parse the joblog $cmd =~ s/\n/\0/g; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/parallel.1 new/parallel-20201022/src/parallel.1 --- old/parallel-20200922/src/parallel.1 2020-08-23 01:22:16.000000000 +0200 +++ new/parallel-20201022/src/parallel.1 2020-10-22 22:02:48.000000000 +0200 @@ -133,7 +133,7 @@ .\" ======================================================================== .\" .IX Title "PARALLEL 1" -.TH PARALLEL 1 "2020-08-22" "20200822" "parallel" +.TH PARALLEL 1 "2020-10-22" "20201022" "parallel" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l @@ -597,8 +597,8 @@ .IX Item "--bner replace-str" .PD Use the replacement string \fIreplace-str\fR instead of \fB{/.}\fR for basename of input line without extension. -.IP "\fB\-\-bin\fR \fIbinexpr\fR (beta testing)" 4 -.IX Item "--bin binexpr (beta testing)" +.IP "\fB\-\-bin\fR \fIbinexpr\fR" 4 +.IX Item "--bin binexpr" Use \fIbinexpr\fR as binning key and bin input to the jobs. .Sp \&\fIbinexpr\fR is [column number|column name] [perlexpression] e.g. 3, @@ -942,8 +942,8 @@ \&\fB\-\-group\fR is the default. Can be reversed with \fB\-u\fR. .Sp See also: \fB\-\-line\-buffer\fR \fB\-\-ungroup\fR -.IP "\fB\-\-group\-by\fR \fIval\fR" 4 -.IX Item "--group-by val" +.IP "\fB\-\-group\-by\fR \fIval\fR (beta testing)" 4 +.IX Item "--group-by val (beta testing)" Group input by value. Combined with \fB\-\-pipe\fR/\fB\-\-pipepart\fR \&\fB\-\-group\-by\fR groups lines with the same value into a record. .Sp @@ -4236,6 +4236,14 @@ output. .PP If you have a lot of hosts use '\-j0' to access more hosts in parallel. +.SH "EXAMPLE: Running 'sudo' on remote computers" +.IX Header "EXAMPLE: Running 'sudo' on remote computers" +Put the password into passwordfile then run: +.PP +.Vb 2 +\& parallel \-\-ssh \*(Aqcat passwordfile | ssh\*(Aq \-\-nonall \e +\& \-S user@server1,user@server2 sudo \-S ls \-l /root +.Ve .SH "EXAMPLE: Using remote computers behind NAT wall" .IX Header "EXAMPLE: Using remote computers behind NAT wall" If the workers are behind a \s-1NAT\s0 wall, you need some trickery to get to diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/parallel.html new/parallel-20201022/src/parallel.html --- old/parallel-20200922/src/parallel.html 2020-08-23 01:22:15.000000000 +0200 +++ new/parallel-20201022/src/parallel.html 2020-10-22 22:02:48.000000000 +0200 @@ -78,6 +78,7 @@ <li><a href="#EXAMPLE:-Transferring-of-files">EXAMPLE: Transferring of files</a></li> <li><a href="#EXAMPLE:-Distributing-work-to-local-and-remote-computers">EXAMPLE: Distributing work to local and remote computers</a></li> <li><a href="#EXAMPLE:-Running-the-same-command-on-remote-computers">EXAMPLE: Running the same command on remote computers</a></li> + <li><a href="#EXAMPLE:-Running-sudo-on-remote-computers">EXAMPLE: Running 'sudo' on remote computers</a></li> <li><a href="#EXAMPLE:-Using-remote-computers-behind-NAT-wall">EXAMPLE: Using remote computers behind NAT wall</a> <ul> <li><a href="#No-jumphost-but-port-forwards">No jumphost, but port forwards</a></li> @@ -573,7 +574,7 @@ <p>Use the replacement string <i>replace-str</i> instead of <b>{/.}</b> for basename of input line without extension.</p> </dd> -<dt id="bin-binexpr-beta-testing"><b>--bin</b> <i>binexpr</i> (beta testing)</dt> +<dt id="bin-binexpr"><b>--bin</b> <i>binexpr</i></dt> <dd> <p>Use <i>binexpr</i> as binning key and bin input to the jobs.</p> @@ -869,7 +870,7 @@ <p>See also: <b>--line-buffer</b> <b>--ungroup</b></p> </dd> -<dt id="group-by-val"><b>--group-by</b> <i>val</i></dt> +<dt id="group-by-val-beta-testing"><b>--group-by</b> <i>val</i> (beta testing)</dt> <dd> <p>Group input by value. Combined with <b>--pipe</b>/<b>--pipepart</b> <b>--group-by</b> groups lines with the same value into a record.</p> @@ -3721,6 +3722,13 @@ <p>If you have a lot of hosts use '-j0' to access more hosts in parallel.</p> +<h1 id="EXAMPLE:-Running-sudo-on-remote-computers">EXAMPLE: Running 'sudo' on remote computers</h1> + +<p>Put the password into passwordfile then run:</p> + +<pre><code> parallel --ssh 'cat passwordfile | ssh' --nonall \ + -S user@server1,user@server2 sudo -S ls -l /root</code></pre> + <h1 id="EXAMPLE:-Using-remote-computers-behind-NAT-wall">EXAMPLE: Using remote computers behind NAT wall</h1> <p>If the workers are behind a NAT wall, you need some trickery to get to them.</p> Binary files old/parallel-20200922/src/parallel.pdf and new/parallel-20201022/src/parallel.pdf differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/parallel.pod new/parallel-20201022/src/parallel.pod --- old/parallel-20200922/src/parallel.pod 2020-08-23 01:15:25.000000000 +0200 +++ new/parallel-20201022/src/parallel.pod 2020-10-22 21:31:36.000000000 +0200 @@ -510,7 +510,7 @@ Use the replacement string I<replace-str> instead of B<{/.}> for basename of input line without extension. -=item B<--bin> I<binexpr> (beta testing) +=item B<--bin> I<binexpr> Use I<binexpr> as binning key and bin input to the jobs. @@ -879,7 +879,7 @@ See also: B<--line-buffer> B<--ungroup> -=item B<--group-by> I<val> +=item B<--group-by> I<val> (beta testing) Group input by value. Combined with B<--pipe>/B<--pipepart> B<--group-by> groups lines with the same value into a record. @@ -4056,6 +4056,14 @@ If you have a lot of hosts use '-j0' to access more hosts in parallel. +=head1 EXAMPLE: Running 'sudo' on remote computers + +Put the password into passwordfile then run: + + parallel --ssh 'cat passwordfile | ssh' --nonall \ + -S user@server1,user@server2 sudo -S ls -l /root + + =head1 EXAMPLE: Using remote computers behind NAT wall If the workers are behind a NAT wall, you need some trickery to get to diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/parallel.texi new/parallel-20201022/src/parallel.texi --- old/parallel-20200922/src/parallel.texi 2020-08-23 01:22:19.000000000 +0200 +++ new/parallel-20201022/src/parallel.texi 2020-10-22 22:02:53.000000000 +0200 @@ -58,6 +58,7 @@ * EXAMPLE@asis{:} Transferring of files:: * EXAMPLE@asis{:} Distributing work to local and remote computers:: * EXAMPLE@asis{:} Running the same command on remote computers:: +* EXAMPLE@asis{:} Running 'sudo' on remote computers:: * EXAMPLE@asis{:} Using remote computers behind NAT wall:: * EXAMPLE@asis{:} Parallelizing rsync:: * EXAMPLE@asis{:} Use multiple inputs in one command:: @@ -638,8 +639,8 @@ Use the replacement string @emph{replace-str} instead of @strong{@{/.@}} for basename of input line without extension. -@item @strong{--bin} @emph{binexpr} (beta testing) -@anchor{@strong{--bin} @emph{binexpr} (beta testing)} +@item @strong{--bin} @emph{binexpr} +@anchor{@strong{--bin} @emph{binexpr}} Use @emph{binexpr} as binning key and bin input to the jobs. @@ -1025,8 +1026,8 @@ See also: @strong{--line-buffer} @strong{--ungroup} -@item @strong{--group-by} @emph{val} -@anchor{@strong{--group-by} @emph{val}} +@item @strong{--group-by} @emph{val} (beta testing) +@anchor{@strong{--group-by} @emph{val} (beta testing)} Group input by value. Combined with @strong{--pipe}/@strong{--pipepart} @strong{--group-by} groups lines with the same value into a record. @@ -4670,6 +4671,16 @@ If you have a lot of hosts use '-j0' to access more hosts in parallel. +@node EXAMPLE: Running 'sudo' on remote computers +@chapter EXAMPLE: Running 'sudo' on remote computers + +Put the password into passwordfile then run: + +@verbatim + parallel --ssh 'cat passwordfile | ssh' --nonall \ + -S user@server1,user@server2 sudo -S ls -l /root +@end verbatim + @node EXAMPLE: Using remote computers behind NAT wall @chapter EXAMPLE: Using remote computers behind NAT wall diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/parsort new/parallel-20201022/src/parsort --- old/parallel-20200922/src/parsort 2020-08-23 12:12:11.000000000 +0200 +++ new/parallel-20201022/src/parsort 2020-10-22 22:00:30.000000000 +0200 @@ -65,7 +65,7 @@ =head1 DEPENDENCIES -B<parsort> uses B<sort>, B<bash>, B<parallel>, and B<mbuffer>. +B<parsort> uses B<sort>, B<bash>, and B<parallel>. =head1 SEE ALSO @@ -82,6 +82,7 @@ Getopt::Long::Configure("bundling","require_order"); my @ARGV_before = @ARGV; + GetOptions( "debug|D" => \$opt::D, "version" => \$opt::version, @@ -117,7 +118,7 @@ "help" => \$opt::dummy, ) || exit(255); $Global::progname = ($0 =~ m:(^|/)([^/]+)$:)[1]; -$Global::version = 20200823; +$Global::version = 20201022; if($opt::version) { version(); exit 0; } @Global::sortoptions = @ARGV_before[0..($#ARGV_before-$#ARGV-1)]; #if($opt::zero_terminated) { $/ = "\0"; } @@ -136,8 +137,9 @@ my $b = shift @cmd; $a &&= "<($a)"; $b &&= "<($b)"; - # Ignore errors from mbuffer - it gives errors when a pipe is closed - push @tmp, "sort -m @Global::sortoptions $a $b | ".buffer(); + # This looks like useless use of 'cat', but contrary to + # naive belief it increases performance dramatically. + push @tmp, "sort -m @Global::sortoptions $a $b | cat" } @cmd = @tmp; } @@ -173,17 +175,8 @@ if(fork) { } else { exec(qw(parallel -j),$numthreads, - # 1M 30M = 43s - # 3M 30M = 59s - # 300k 30M = 40-45s - # 100k 30M = 47s - # 500k 30M = 44s - # 300k 10M = 41-45s - # 256k 10M = 42-44s - # 300k 3M = 42-45s - # 300k - = 47s # 286k is the best mean value after testing 250..350 - qw(--block 286k --pipe --roundrobin ),buffer(),qw(> {} :::),@fifos); + qw(--block 286k --pipe --roundrobin cat > {} :::),@fifos); } # The command uses <(...) so it is incompatible with /bin/sh open(my $bash,"|-","bash") || die; @@ -219,43 +212,6 @@ return $tmpfifo; } -{ - my $buffer; - - sub buffer { - if(not defined $buffer) { - if(which("mbuffker")) { - # Use mbuffer if installed - # 30M = 43s - # 10M = 41-45s - # 3M = 42-45s - # Ignore errors from mbuffer - it gives errors when a pipe is closed - $buffer = "mbuffer -v0 -q -m 30M"; - } else { - $buffer = "cat"; - } - } - return $buffer; - } -} - -sub which { - # Input: - # @programs = programs to find the path to - # Returns: - # @full_path = full paths to @programs. Nothing if not found - my @which; - for my $prg (@_) { - push(@which, grep { not -d $_ and -x $_ } - map { $_."/".$prg } split(":",$ENV{'PATH'})); - if($prg =~ m:/:) { - # Including path - push(@which, grep { not -d $_ and -x $_ } $prg); - } - } - return wantarray ? @which : $which[0]; -} - sub version() { # Returns: N/A print join diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/parsort.1 new/parallel-20201022/src/parsort.1 --- old/parallel-20200922/src/parsort.1 2020-08-23 12:35:39.000000000 +0200 +++ new/parallel-20201022/src/parsort.1 2020-10-22 22:02:47.000000000 +0200 @@ -133,7 +133,7 @@ .\" ======================================================================== .\" .IX Title "PARSORT 1" -.TH PARSORT 1 "2020-08-23" "20200822" "parallel" +.TH PARSORT 1 "2020-10-22" "20201022" "parallel" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l @@ -190,7 +190,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. .SH "DEPENDENCIES" .IX Header "DEPENDENCIES" -\&\fBparsort\fR uses \fBsort\fR, \fBbash\fR, \fBparallel\fR, and \fBmbuffer\fR. +\&\fBparsort\fR uses \fBsort\fR, \fBbash\fR, and \fBparallel\fR. .SH "SEE ALSO" .IX Header "SEE ALSO" \&\fBsort\fR diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/parsort.html new/parallel-20201022/src/parsort.html --- old/parallel-20200922/src/parsort.html 2020-09-23 10:10:07.000000000 +0200 +++ new/parallel-20201022/src/parsort.html 2020-10-22 22:02:51.000000000 +0200 @@ -69,7 +69,7 @@ <h1 id="DEPENDENCIES">DEPENDENCIES</h1> -<p><b>parsort</b> uses <b>sort</b>, <b>bash</b>, <b>parallel</b>, and <b>mbuffer</b>.</p> +<p><b>parsort</b> uses <b>sort</b>, <b>bash</b>, and <b>parallel</b>.</p> <h1 id="SEE-ALSO">SEE ALSO</h1> Binary files old/parallel-20200922/src/parsort.pdf and new/parallel-20201022/src/parsort.pdf differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/parsort.texi new/parallel-20201022/src/parsort.texi --- old/parallel-20200922/src/parsort.texi 2020-08-23 12:35:41.000000000 +0200 +++ new/parallel-20201022/src/parsort.texi 2020-10-22 22:02:48.000000000 +0200 @@ -88,7 +88,7 @@ @node DEPENDENCIES @chapter DEPENDENCIES -@strong{parsort} uses @strong{sort}, @strong{bash}, @strong{parallel}, and @strong{mbuffer}. +@strong{parsort} uses @strong{sort}, @strong{bash}, and @strong{parallel}. @node SEE ALSO @chapter SEE ALSO diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/sem new/parallel-20201022/src/sem --- old/parallel-20200922/src/sem 2020-09-23 10:09:33.000000000 +0200 +++ new/parallel-20201022/src/sem 2020-10-22 22:00:30.000000000 +0200 @@ -881,16 +881,17 @@ # Numbered 0..n-1 due to being used by $F[n] if($group_by::col) { $group_by::col--; } - my $loop = ::spacefree(0,'{ - local $_=COLVALUE; - PERLEXPR; - if(! defined $last) { $last = $_ } - if(($last) ne $_) { - print "RECSEP"; - $last = $_; + my $loop = ::spacefree(0,q{ + BEGIN{ $last = "RECSEP"; } + { + local $_=COLVALUE; + PERLEXPR; + if(($last) ne $_) { + print "RECSEP"; + $last = $_; + } } - }'); - + }); if(defined $group_by::col) { $loop =~ s/COLVALUE/\$F[$group_by::col]/g; } else { @@ -2086,6 +2087,9 @@ $Global::sql = SQL->new($opt::sqlmaster || $opt::sqlworker); } if($opt::sqlworker) { $Global::membuffer ||= 1; } + # The sqlmaster groups the arguments, so the should just read one + if($opt::sqlworker and not $opt::sqlmaster) { $Global::max_number_of_args = 1; } + } sub check_invalid_option_combinations() { @@ -2160,7 +2164,7 @@ sub init_globals() { # Defaults: - $Global::version = 20200922; + $Global::version = 20201022; $Global::progname = 'parallel'; $::name = "GNU Parallel"; $Global::infinity = 2**31; @@ -3902,7 +3906,9 @@ return undef; } } - $job->set_sshlogin($sshlogin); + if(not $job->suspended()) { + $job->set_sshlogin($sshlogin); + } if($opt::retries and $job->failed_here()) { # This command with these args failed for this sshlogin my ($no_of_failed_sshlogins,$min_failures) = $job->min_failed(); @@ -4525,6 +4531,7 @@ # -P should only go to the first, and -S should not be copied at all. my $options = join(" ", + ((defined $opt::sshdelay) ? "--delay ".$opt::sshdelay : ""), ((defined $opt::memfree) ? "--memfree ".$opt::memfree : ""), ((defined $opt::memsuspend) ? "--memfree ".$opt::memsuspend : ""), ((defined $opt::D) ? "-D $opt::D" : ""), @@ -4539,6 +4546,7 @@ ); my $suboptions = join(" ", + ((defined $opt::sshdelay) ? "--delay ".$opt::sshdelay : ""), ((defined $opt::D) ? "-D $opt::D" : ""), ((defined $opt::arg_file_sep) ? "--arg-file-sep ".$opt::arg_file_sep : ""), ((defined $opt::arg_sep) ? "--arg-sep ".$opt::arg_sep : ""), @@ -4554,6 +4562,7 @@ ((defined $opt::retries) ? "--retries ".$opt::retries : ""), ((defined $opt::timeout) ? "--timeout ".$opt::timeout : ""), ((defined $opt::ungroup) ? "-u" : ""), + ((defined $opt::ssh) ? "--ssh '".$opt::ssh."'" : ""), ((defined $opt::tee) ? "--tee" : ""), ((defined $opt::workdir) ? "--wd ".Q($opt::workdir) : ""), (@Global::transfer_files ? map { "--tf ".Q($_) } @@ -4808,12 +4817,8 @@ # Convert pids to process groups ($processgroup = -$pid) my @pgrps = map { -$_ } @_; my @term_seq = split/,/,$opt::termseq; - if($opt::memsuspend) { - @term_seq = ("STOP",1); - } else { - if(not @term_seq) { - @term_seq = ("TERM",200,"TERM",100,"TERM",50,"KILL",25); - } + if(not @term_seq) { + @term_seq = ("TERM",200,"TERM",100,"TERM",50,"KILL",25); } while(@term_seq) { @pgrps = kill_sleep(shift @term_seq, shift @term_seq, @pgrps); @@ -4913,14 +4918,14 @@ "--recend str Record end separator for --pipe.", "--recstart str Record start separator for --pipe.", "", - "See 'man $Global::progname' for details", + "GNU Parallel can do much more. See 'man $Global::progname' for details", "", "Academic tradition requires you to cite works you base your article on.", "If you use programs that use GNU Parallel to process data for an article in a", "scientific publication, please cite:", "", - " Tange, O. (2020, September 22). GNU Parallel 20200922 ('Ginsburg').", - " Zenodo. https://doi.org/10.5281/zenodo.4045386", + " Tange, O. (2020, October 22). GNU Parallel 20201022 ('SamuelPaty').", + " Zenodo. https://doi.org/10.5281/zenodo.4118697", "", # Before changing this line, please read # https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice @@ -4950,8 +4955,8 @@ "If you use programs that use GNU Parallel to process data for an article in a", "scientific publication, please cite:", "", - " Tange, O. (2020, September 22). GNU Parallel 20200922 ('Ginsburg').", - " Zenodo. https://doi.org/10.5281/zenodo.4045386", + " Tange, O. (2020, October 22). GNU Parallel 20201022 ('SamuelPaty').", + " Zenodo. https://doi.org/10.5281/zenodo.4118697", "", # Before changing this line, please read # https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice and @@ -5064,20 +5069,20 @@ "If you use programs that use GNU Parallel to process data for an article in a", "scientific publication, please cite:", "", - "\@software{tange_2020_4045386,", + "\@software{tange_2020_4118697,", " author = {Tange, Ole},", - " title = {GNU Parallel 20200922 ('Ginsburg')},", - " month = Sep,", + " title = {GNU Parallel 20201022 ('SamuelPaty')},", + " month = Oct,", " year = 2020,", " note = {{GNU Parallel is a general parallelizer to run", " multiple serial command line programs in parallel", " without changing them.}},", " publisher = {Zenodo},", - " doi = {10.5281/zenodo.4045386},", - " url = {https://doi.org/10.5281/zenodo.4045386}", + " doi = {10.5281/zenodo.4118697},", + " url = {https://doi.org/10.5281/zenodo.4118697}", "}", "", - "(Feel free to use \\nocite{tange_2020_4045386})", + "(Feel free to use \\nocite{tange_2020_4118697})", "", # Before changing this line, please read # https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice and @@ -5972,13 +5977,17 @@ @{$jobs_of{$sshlogin}})); ::debug("mem","\n", $job->seq(), "killed ", $sshlogin->memfree()," < ",$limit); - $job->kill(); + if($opt::memsuspend) { + $job->suspend(); + } else { + $job->kill(); + } $sshlogin->memfree_recompute(); } else { last; } } - ::debug("mem","Free mem OK ", + ::debug("mem","Free mem OK? ", $sshlogin->memfree()," > ",$limit); } } @@ -8626,11 +8635,15 @@ my $self = shift; $self->set_exitstatus(-1); ::kill_sleep_seq($self->pid()); +} + +sub suspend($) { + my $self = shift; + my @pgrps = map { -$_ } $self->pid(); + kill "STOP", @pgrps; + $self->set_suspended(1); # push job onto start stack - if($opt::memsuspend) { - $self->{'suspended'} = 1; - $Global::JobQueue->{'commandlinequeue'}->unget($self); - } + $Global::JobQueue->unget($self); } sub set_suspended($$) { @@ -8643,6 +8656,13 @@ return $self->{'suspended'}; } +sub resume($) { + my $self = shift; + my @pgrps = map { -$_ } $self->pid(); + kill "CONT", @pgrps; + $self->set_suspended(0); +} + sub failed($) { # return number of times failed for this $sshlogin # Input: @@ -9058,6 +9078,7 @@ ::spacefree(0,'$shell = "'.($ENV{'PARALLEL_SHELL'} || '$ENV{SHELL}').'";'. '$tmpdir = "'.::perl_quote_scalar($ENV{'TMPDIR'}).'";'. '$nice = '.$opt::nice.';'. + '$termseq = "'.$opt::termseq.'";'. q{ # Set $PARALLEL_TMP to a non-existent file name in $TMPDIR do { @@ -9079,8 +9100,17 @@ $s = $s < 1 ? 0.001 + $s * 1.03 : $s; select(undef, undef, undef, $s); } until ($done || getppid == 1); - # Kill HUP the process group if job not done - kill(SIGHUP, -${pid}) unless $done; + if(not $done) { + # Kill as per --termseq + my @term_seq = split/,/,$termseq; + if(not @term_seq) { + @term_seq = ("TERM",200,"TERM",100,"TERM",50,"KILL",25); + } + while(@term_seq && kill(0,-$pid)) { + kill(shift @term_seq, -$pid); + select(undef, undef, undef, (shift @term_seq)/1000); + } + } wait; exit ($?&127 ? 128+($?&127) : 1+$?>>8) }); @@ -9647,7 +9677,7 @@ my $job = shift; if($job->suspended()) { # Job is kill -STOP'ped: Restart it. - kill "CONT", $job->pid(); + $job->resume(); return $job; } # Get the shell command to be executed (possibly with ssh infront). @@ -10330,7 +10360,7 @@ $cmd = $self->replaced(); } else { # Verbose level > 1: Print the rsync and stuff - $cmd = join " ", @{$self->{'commandline'}}; + $cmd = $self->wrapped(); } # Newlines make it hard to parse the joblog $cmd =~ s/\n/\0/g; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/sql new/parallel-20201022/src/sql --- old/parallel-20200922/src/sql 2020-09-23 10:09:33.000000000 +0200 +++ new/parallel-20201022/src/sql 2020-10-22 22:00:30.000000000 +0200 @@ -574,7 +574,7 @@ exit ($err); sub parse_options { - $Global::version = 20200922; + $Global::version = 20201022; $Global::progname = 'sql'; # This must be done first as this may exec myself diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200922/src/sql.1 new/parallel-20201022/src/sql.1 --- old/parallel-20200922/src/sql.1 2020-09-23 10:10:04.000000000 +0200 +++ new/parallel-20201022/src/sql.1 2020-10-22 22:02:48.000000000 +0200 @@ -133,7 +133,7 @@ .\" ======================================================================== .\" .IX Title "SQL 1" -.TH SQL 1 "2020-09-23" "20200922" "parallel" +.TH SQL 1 "2020-10-22" "20201022" "parallel" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l ++++++ parallel-20200922.tar.bz2.sig -> parallel-20201022.tar.bz2.sig ++++++ --- /work/SRC/openSUSE:Factory/gnu_parallel/parallel-20200922.tar.bz2.sig 2020-10-10 19:05:18.324513250 +0200 +++ /work/SRC/openSUSE:Factory/.gnu_parallel.new.3463/parallel-20201022.tar.bz2.sig 2020-11-02 10:36:52.683316645 +0100 @@ -2,7 +2,7 @@ # To check the signature run: # echo | gpg -# gpg --auto-key-locate keyserver --keyserver-options auto-key-retrieve parallel-20200922.tar.bz2.sig +# gpg --auto-key-locate keyserver --keyserver-options auto-key-retrieve parallel-20201022.tar.bz2.sig echo | gpg 2>/dev/null gpg --auto-key-locate keyserver --keyserver-options auto-key-retrieve $0 @@ -10,32 +10,32 @@ -----BEGIN PGP SIGNATURE----- -iQUHBAABCgAdFiEEzaAaQgjE90UGEH570atFFoiIiIgFAl9rAv0ACgkQ0atFFoiI -iIj3XiaeKlkb420gZysWj7m13duYwl8aNzrGjC4bMJXy4rHguusW2gqAmO5PD6H8 -6dDRxzB1HM5J8A4Y3f9pkbMPGep8gTpeAXa/cdRCRXeRB6+LLWv+cbWd7Fi8E348 -/NR2WQvd7RjUMiKZX4ZzbWDE37FHcgmCPBEelQCswg9l8bhmKRgfNUH2/vkT17PZ -6IOjh0X3zzQqhbnxTeBQ0iQCI+t0AkqUNIPSOMBNMLfieQVppVI1a00dM5inNMQ8 -Gn2WFT2R/9W3lDjwfncicW4n8Tv8IiHSKkIrte4hTrIhjSqkXKXYnYDsVH7Ot1lU -lyNs9YAUC9soeZ9Bfd+Fd8mRhowJcx4wn50E54LE4UckFSt/cUae3FCLL+qRAHFG -XUt0rn5XIjsYNQkHN+LDfYx6jOz8Ou1vMsw4CLMg5RS7vwQidrPiXgh2jLnhILR2 -kDxzUBgR1DIhKU3ThzmjJGRtH7A1YRhpvFbawq+GJeLhvYjDT3r8XhwnxvjrsE2x -ypV0WA3y3CXQSbgxeI3O4C+pOsNQgkpH+Dgd7f2U9fhO7EyvWPXcoERLki/YiVyV -AEcxN3FKIiRoXkN+H60A7ztsYLe3ae0tBNFKTf9TRoYV+zZ0BO970sMJ84jAnO7+ -A1bCgZFK7pr50Ji8Y2jaRiWm+vo+OK6qEv1aeM572ksSZITDbLR1gcW7xSWWm6tJ -ZLKnIK3uXb7Kmv5NJHrGwXfqk+4Rkv+LZ7vAGJbRNQI3uNQSS0DDDh7iBtFCoVS9 -O8DOrk9H1Hgdk4slvBfHigcfkBCKKV4Dbtl59Q5Y4jYRsCY78oZkftlz+NEpn6+o -vSL8eEpuXRBCCjOCfLcBmVbS5yTHhakmNjUWLBBIxrfNntPijrbs+OCwtQ5xmzBl -nGGB3/wAnFeiC+uhcxj023mrt05FaEYQS28ouyvIaqbsFXiWzFvwJIm34EcPrSqu -xFoMHP+HjBwSO8a3fAcy9u+cg/5kRMVV9Pnsi9+YjqJMaNpbx/0qLK0xo8t/fHkr -i6FUG13l0Ma0TNyBsrLVFrhjgbl0wDCKv3kEg1p95vFCgnvON5bBor9pnzcX43UV -BpQrI9/8/4+4Ugk1f/ejiY8Zup0izraSB3JWCpBP0mG5VNSnaylmfkcnKZlkKrBT -yu5xUHJ/vmxyl/+1g2xqaomo4OE/Sf/oIdiUcZZEjYregiVYF+VENH8jHZ6ougKF -OJk2FWWGrz3cCSZxs18cF7kMxaQIeVwoXqV0aD0xjfsqVr2HExhGn4QSvzqAEFCL -vrqhOUpSdYIvGok/2+xh0dzx1YVSUCXsHfsLUQAnHtPQIsATgz/veQrLoq84oRMU -pcFa4e9ksqSmSF1dIJBVjVxMFd11vF+PPZ9FYT7kGgv8tA7p1lHuQYgCg/ZJD0/6 -KufNjYpvStq4r+QiSYbosyTOFg1pwwtdwN48o6oIh3thCsu9aoh5Y3JWQtFiFC2l -9Wcams/SqTCRXZz6FpANv29wciWFXaz+HUnq4dLGs9jtWNeodsKmckN+pZNu5Lef -E3hH6M3ajMizYlZdF3FYfch0eeF+xluaaKMNplLfVH98GsJCAVZ3NEqxh+5/CYz4 -dnZQ3Sj1gEsypE2l5qn+lpJJwbABpSRI35moAb+j7XALJYxvra/W4kfr -=sy79 +iQUHBAABCgAdFiEEzaAaQgjE90UGEH570atFFoiIiIgFAl+R5ZgACgkQ0atFFoiI +iIjz4SaeLIx4rlxp5OLgXmj+0qwW+243aAZ1HNvNYKorDms+v6M0ffYGIYjFK2+7 +6iLPUQpglkDN5W59LcGKKMxL+sfsKzdHkDdnMX1LHUIirugEn+cPSrLDxM01BAgK +lTfAzu5CaGh4OO8zjNGA+0aadZBFdwHiJXTJju/P4agl6K3a6J65NcwT5NbTvGoQ +vMVSylAHJ6a+S6PhonsDCG7C7QHOsnXdRpgDG0H5fjTk5HaaHztcBTUyCBnyEeGa +4ki0ROUJrhyx2fgoKpsbvQIz9HwvaPEvfLlC73s/b36bOe0JgOUshkYUVgBhUozQ +7N4/ann3jRBhZcqQkuoWduWosve7V6I+E/F4SRS9pkCMla9xoBBI6v7TXOtrR1Ml +Cc6GBSU/OaHdO5R8gX4vGy4j17XPt+ILyo2DcGXRZ14BAudOkOdU4beO3yrkHlJ3 +4FSlGCQ9CyBF2h3M3ICyTW//T8tzSvAec7lThHwUv7eqNP2VZr34519YGC43xFb3 +Xmtcv7bmk8V4g1jE0L1sIxTMR3YPR9eh71AxTpNw2OzrrXgMIg5WRpVZEKh43pZQ +pReyRgwJNZlUGCAINGbjd3U0L91AtKCJzsvjloQ+vbzr+ZyfXPITc3LOyEN5XPBl +5esAwmrolgr0C8WWUtBWKPAdgy6d0F1S9VvTLBaZ1Hk9bYKK1nM4VxnITD8XnKj+ +OZZapHwr3yUKr3oW49YZM2TVWCgr9gK4xpF63+6Ze8xQdoz/lMWBFiZuoKRApR2U +SEi3TIxoBxktT9W/gjhwtl4gWRCgvxUAzd/bddFTHGrOEgnc6Zeyeg5d5lCU/umd +o6xQTkudcfLSFAesReN+qkkacz8s1M9LI2Qs7GQgMt6RYJskD72yiOJDxjX3TA+G +9QTJjMO2MM+m+QnGFdL6bLNGUovTR3r3U8zFUVxowx9kLQ2FAHF9r5WmD4U2El2Z +7n3Xn6FL26aSN9bkntR0V3IYT3pf/gkV66mdKRc+C/u99CSajWz9Fm9AZkvwDJkU +c+OckfqFmSg/tkSr8sKlgXbGJZZzef5vPxh4r0fk9q3UqSwHKKLIzjJ0Ztukv+se +j2dk11oY2p1xJ2itBjrnwWSJRisRtDpTKmyddeGAduHh2MzxHCQs8K8ErIH1b9Y4 +dNTs5DQGMLgVK3rOlMYG6gz7GF2OGcdAE/7uVbKYJFx0BLEiEqbqER4KlOtPi+L1 +3ZPbjjZqBJdoEDi3PugD2EquuyKTkhqLgggOQjuhTWnZqd5Ys/rlXAkhqZvHmvCD +0gz6QHKV6lrMAbQhf0URvEsaV/puxhsAulIya7VUtETmSz/k0wtd0aSI2FRytZhX +vCziAn57STk02ARgVxK2vUw69IgZJ7HbXM0Emnanudy8rzmzc9yg8o/bFOh2EMT7 +soG5uk15Uqc4HAbR4TUk579yEIJlHxAcXMiuC2A5wEa7YYBBRUa6mvpcVsQPwF88 +zSTDikr3vgm/1gp9KGDZhvp4QvdaF8++1targJcI8bAfEDaou9aWg4eXKO1XxLK8 +r1V94RX3IG61Qjty7qW4kK/PrTaf8IEXNwlwUxgTkt/s+nUj20JJG4G80Qmte5UK +ED1FIZSXVF3Bfekmal07qTo64XxSgglpVF32C+cT+h3q4UoBvGgl/KRW +=Nah0 -----END PGP SIGNATURE-----