Hello community, here is the log from the commit of package gnu_parallel for openSUSE:Factory checked in at 2020-10-10 19:05:13 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gnu_parallel (Old) and /work/SRC/openSUSE:Factory/.gnu_parallel.new.4249 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gnu_parallel" Sat Oct 10 19:05:13 2020 rev:59 rq:840485 version:20200922 Changes: -------- --- /work/SRC/openSUSE:Factory/gnu_parallel/gnu_parallel.changes 2020-09-06 00:04:53.899328832 +0200 +++ /work/SRC/openSUSE:Factory/.gnu_parallel.new.4249/gnu_parallel.changes 2020-10-10 19:05:18.156513162 +0200 @@ -1,0 +2,6 @@ +Fri Oct 9 18:12:26 UTC 2020 - Jan Engelhardt <jeng...@inai.de> + +- Update to release 20200922 + * New CPU detection for GNU/Linux + +------------------------------------------------------------------- @@ -6 +11,0 @@ - Old: ---- parallel-20200822.tar.bz2 parallel-20200822.tar.bz2.sig New: ---- parallel-20200922.tar.bz2 parallel-20200922.tar.bz2.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gnu_parallel.spec ++++++ --- /var/tmp/diff_new_pack.p7Meii/_old 2020-10-10 19:05:18.844513521 +0200 +++ /var/tmp/diff_new_pack.p7Meii/_new 2020-10-10 19:05:18.848513523 +0200 @@ -17,7 +17,7 @@ Name: gnu_parallel -Version: 20200822 +Version: 20200922 Release: 0 Summary: Shell tool for executing jobs in parallel License: GPL-3.0-or-later ++++++ parallel-20200822.tar.bz2 -> parallel-20200922.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/NEWS new/parallel-20200922/NEWS --- old/parallel-20200822/NEWS 2020-08-23 01:13:55.000000000 +0200 +++ new/parallel-20200922/NEWS 2020-09-23 10:05:20.000000000 +0200 @@ -1,3 +1,15 @@ +20200922 + +* New CPU detection for GNU/Linux. + +* Bug fixes and man page updates. + +News about GNU Parallel: + +* Aug 21, 2020 - More Unix tools + https://floki.blog/2020/08/more_unix_tools + + 20200822 New in this release: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/README new/parallel-20200922/README --- old/parallel-20200822/README 2020-08-23 01:20:56.000000000 +0200 +++ new/parallel-20200922/README 2020-09-23 10:09:33.000000000 +0200 @@ -57,11 +57,11 @@ Full installation of GNU Parallel is as simple as: - wget https://ftpmirror.gnu.org/parallel/parallel-20200822.tar.bz2 - wget https://ftpmirror.gnu.org/parallel/parallel-20200822.tar.bz2.sig - gpg parallel-20200822.tar.bz2.sig - bzip2 -dc parallel-20200822.tar.bz2 | tar xvf - - cd parallel-20200822 + 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 ./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-20200822.tar.bz2 - wget https://ftpmirror.gnu.org/parallel/parallel-20200822.tar.bz2.sig - gpg parallel-20200822.tar.bz2.sig - bzip2 -dc parallel-20200822.tar.bz2 | tar xvf - - cd parallel-20200822 + 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 ./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, August 22). GNU Parallel 20200822 ('Beirut'). - Zenodo. https://doi.org/10.5281/zenodo.3996295 + Tange, O. (2020, September 22). GNU Parallel 20200922 ('Ginsburg'). + Zenodo. https://doi.org/10.5281/zenodo.4045386 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-20200822/configure new/parallel-20200922/configure --- old/parallel-20200822/configure 2020-08-23 01:22:13.000000000 +0200 +++ new/parallel-20200922/configure 2020-09-23 10:09:59.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 20200822. +# Generated by GNU Autoconf 2.69 for parallel 20200922. # # Report bugs to <bug-paral...@gnu.org>. # @@ -579,8 +579,8 @@ # Identity of this package. PACKAGE_NAME='parallel' PACKAGE_TARNAME='parallel' -PACKAGE_VERSION='20200822' -PACKAGE_STRING='parallel 20200822' +PACKAGE_VERSION='20200922' +PACKAGE_STRING='parallel 20200922' 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 20200822 to adapt to many kinds of systems. +\`configure' configures parallel 20200922 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 20200822:";; + short | recursive ) echo "Configuration of parallel 20200922:";; esac cat <<\_ACEOF @@ -1357,7 +1357,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -parallel configure 20200822 +parallel configure 20200922 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 20200822, which was +It was created by parallel $as_me 20200922, 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='20200822' + VERSION='20200922' 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 20200822, which was +This file was extended by parallel $as_me 20200922, 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 20200822 +parallel config.status 20200922 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-20200822/configure.ac new/parallel-20200922/configure.ac --- old/parallel-20200822/configure.ac 2020-08-23 01:20:56.000000000 +0200 +++ new/parallel-20200922/configure.ac 2020-09-23 10:09:33.000000000 +0200 @@ -1,4 +1,4 @@ -AC_INIT([parallel], [20200822], [bug-paral...@gnu.org]) +AC_INIT([parallel], [20200922], [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-20200822/src/env_parallel.1 new/parallel-20200922/src/env_parallel.1 --- old/parallel-20200822/src/env_parallel.1 2020-07-04 11:32:19.000000000 +0200 +++ new/parallel-20200922/src/env_parallel.1 2020-09-19 17:06:59.000000000 +0200 @@ -133,7 +133,7 @@ .\" ======================================================================== .\" .IX Title "ENV_PARALLEL 1" -.TH ENV_PARALLEL 1 "2020-07-04" "20200622" "parallel" +.TH ENV_PARALLEL 1 "2020-09-18" "20200822" "parallel" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l @@ -163,12 +163,12 @@ \& env_parallel \-\-session \& \& # Define whatever you want to use -\& alias myalias=echo -\& myvar=it -\& myfunc() { myalias $1 $myvar works.; } +\& myfunc() { myalias and functions $myvar work. $1.; } +\& alias myalias=\*(Aqecho Aliases\*(Aq +\& myvar=\*(Aqand variables\*(Aq \& \& # env_parallel will not export names in $PARALLEL_IGNORED_NAMES -\& env_parallel \-S localhost myfunc ::: Yay, +\& env_parallel \-S localhost myfunc ::: Hooray .Ve .PP Or: @@ -180,28 +180,28 @@ \& # Optionally edit ~/.parallel/ignored_vars (only needed once) \& \& # Define whatever you want to use -\& alias myalias=echo -\& myvar=it -\& myfunc() { myalias $1 $myvar works.; } +\& myfunc() { myalias and functions $myvar work. $1.; } +\& alias myalias=\*(Aqecho Aliases\*(Aq +\& myvar=\*(Aqand variables\*(Aq \& \& # Use \-\-env _ to only transfer the names not in the "empty" environment -\& env_parallel \-\-env _ \-S localhost myfunc ::: Yay, +\& env_parallel \-\-env _ \-S localhost myfunc ::: Hooray .Ve .PP In \fBcsh\fR \fB\-\-session\fR is not supported: .PP .Vb 2 -\& # Record the "clean" environment (this only needs to be run once) +\& # Record the "clean" environment \- this only needs to be run once \& env_parallel \-\-record\-env \& -\& # Optionally edit ~/.parallel/ignored_vars (only needed once) +\& # Optionally edit ~/.parallel/ignored_vars \- only needed once \& \& # Define whatever you want to use -\& alias myalias \*(Aqecho \e!* $myvar works.\*(Aq -\& set myvar=it +\& alias myalias \*(Aqecho Aliases $myvar \e!*.\*(Aq +\& set myvar=\*(Aqand variables\*(Aq \& \& # Use \-\-env _ to only transfer the names not in the "empty" environment -\& env_parallel \-\-env _ \-S localhost myalias ::: Yay, +\& env_parallel \-\-env _ \-S localhost myalias ::: work .Ve .SS "Environment space" .IX Subsection "Environment space" @@ -955,8 +955,8 @@ .IX Header "AUTHOR" When using \s-1GNU\s0 \fBenv_parallel\fR for a publication please cite: .PP -O. Tange (2011): \s-1GNU\s0 Parallel \- The Command-Line Power Tool, ;login: -The \s-1USENIX\s0 Magazine, February 2011:42\-47. +O. Tange (2018): \s-1GNU\s0 Parallel 2018, March 2018, \s-1ISBN 9781387509881, +DOI: 10\s0.5281/zenodo.1146014. .PP This helps funding further development; and it won't cost you a cent. If you pay 10000 \s-1EUR\s0 you should feel free to use \s-1GNU\s0 Parallel without citing. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/src/env_parallel.html new/parallel-20200922/src/env_parallel.html --- old/parallel-20200822/src/env_parallel.html 2020-08-23 01:22:16.000000000 +0200 +++ new/parallel-20200922/src/env_parallel.html 2020-09-19 17:06:59.000000000 +0200 @@ -125,12 +125,12 @@ env_parallel --session # Define whatever you want to use - alias myalias=echo - myvar=it - myfunc() { myalias $1 $myvar works.; } + myfunc() { myalias and functions $myvar work. $1.; } + alias myalias='echo Aliases' + myvar='and variables' # env_parallel will not export names in $PARALLEL_IGNORED_NAMES - env_parallel -S localhost myfunc ::: Yay,</code></pre> + env_parallel -S localhost myfunc ::: Hooray</code></pre> <p>Or:</p> @@ -140,26 +140,26 @@ # Optionally edit ~/.parallel/ignored_vars (only needed once) # Define whatever you want to use - alias myalias=echo - myvar=it - myfunc() { myalias $1 $myvar works.; } + myfunc() { myalias and functions $myvar work. $1.; } + alias myalias='echo Aliases' + myvar='and variables' # Use --env _ to only transfer the names not in the "empty" environment - env_parallel --env _ -S localhost myfunc ::: Yay,</code></pre> + env_parallel --env _ -S localhost myfunc ::: Hooray</code></pre> <p>In <b>csh</b> <b>--session</b> is not supported:</p> -<pre><code> # Record the "clean" environment (this only needs to be run once) +<pre><code> # Record the "clean" environment - this only needs to be run once env_parallel --record-env - # Optionally edit ~/.parallel/ignored_vars (only needed once) + # Optionally edit ~/.parallel/ignored_vars - only needed once # Define whatever you want to use - alias myalias 'echo \!* $myvar works.' - set myvar=it + alias myalias 'echo Aliases $myvar \!*.' + set myvar='and variables' # Use --env _ to only transfer the names not in the "empty" environment - env_parallel --env _ -S localhost myalias ::: Yay,</code></pre> + env_parallel --env _ -S localhost myalias ::: work</code></pre> <h2 id="Environment-space">Environment space</h2> @@ -935,7 +935,7 @@ <p>When using GNU <b>env_parallel</b> for a publication please cite:</p> -<p>O. Tange (2011): GNU Parallel - The Command-Line Power Tool, ;login: The USENIX Magazine, February 2011:42-47.</p> +<p>O. Tange (2018): GNU Parallel 2018, March 2018, ISBN 9781387509881, DOI: 10.5281/zenodo.1146014.</p> <p>This helps funding further development; and it won't cost you a cent. If you pay 10000 EUR you should feel free to use GNU Parallel without citing.</p> Binary files old/parallel-20200822/src/env_parallel.pdf and new/parallel-20200922/src/env_parallel.pdf differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/src/env_parallel.pod new/parallel-20200922/src/env_parallel.pod --- old/parallel-20200822/src/env_parallel.pod 2020-07-04 11:21:35.000000000 +0200 +++ new/parallel-20200922/src/env_parallel.pod 2020-09-18 23:08:20.000000000 +0200 @@ -31,12 +31,12 @@ env_parallel --session # Define whatever you want to use - alias myalias=echo - myvar=it - myfunc() { myalias $1 $myvar works.; } + myfunc() { myalias and functions $myvar work. $1.; } + alias myalias='echo Aliases' + myvar='and variables' # env_parallel will not export names in $PARALLEL_IGNORED_NAMES - env_parallel -S localhost myfunc ::: Yay, + env_parallel -S localhost myfunc ::: Hooray Or: @@ -46,26 +46,26 @@ # Optionally edit ~/.parallel/ignored_vars (only needed once) # Define whatever you want to use - alias myalias=echo - myvar=it - myfunc() { myalias $1 $myvar works.; } + myfunc() { myalias and functions $myvar work. $1.; } + alias myalias='echo Aliases' + myvar='and variables' # Use --env _ to only transfer the names not in the "empty" environment - env_parallel --env _ -S localhost myfunc ::: Yay, + env_parallel --env _ -S localhost myfunc ::: Hooray In B<csh> B<--session> is not supported: - # Record the "clean" environment (this only needs to be run once) + # Record the "clean" environment - this only needs to be run once env_parallel --record-env - # Optionally edit ~/.parallel/ignored_vars (only needed once) + # Optionally edit ~/.parallel/ignored_vars - only needed once # Define whatever you want to use - alias myalias 'echo \!* $myvar works.' - set myvar=it + alias myalias 'echo Aliases $myvar \!*.' + set myvar='and variables' # Use --env _ to only transfer the names not in the "empty" environment - env_parallel --env _ -S localhost myalias ::: Yay, + env_parallel --env _ -S localhost myalias ::: work =head2 Environment space @@ -793,8 +793,8 @@ When using GNU B<env_parallel> for a publication please cite: -O. Tange (2011): GNU Parallel - The Command-Line Power Tool, ;login: -The USENIX Magazine, February 2011:42-47. +O. Tange (2018): GNU Parallel 2018, March 2018, ISBN 9781387509881, +DOI: 10.5281/zenodo.1146014. This helps funding further development; and it won't cost you a cent. If you pay 10000 EUR you should feel free to use GNU Parallel without citing. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/src/env_parallel.texi new/parallel-20200922/src/env_parallel.texi --- old/parallel-20200822/src/env_parallel.texi 2020-07-04 11:21:47.000000000 +0200 +++ new/parallel-20200922/src/env_parallel.texi 2020-09-19 17:07:02.000000000 +0200 @@ -52,12 +52,12 @@ env_parallel --session # Define whatever you want to use - alias myalias=echo - myvar=it - myfunc() { myalias $1 $myvar works.; } + myfunc() { myalias and functions $myvar work. $1.; } + alias myalias='echo Aliases' + myvar='and variables' # env_parallel will not export names in $PARALLEL_IGNORED_NAMES - env_parallel -S localhost myfunc ::: Yay, + env_parallel -S localhost myfunc ::: Hooray @end verbatim Or: @@ -69,28 +69,28 @@ # Optionally edit ~/.parallel/ignored_vars (only needed once) # Define whatever you want to use - alias myalias=echo - myvar=it - myfunc() { myalias $1 $myvar works.; } + myfunc() { myalias and functions $myvar work. $1.; } + alias myalias='echo Aliases' + myvar='and variables' # Use --env _ to only transfer the names not in the "empty" environment - env_parallel --env _ -S localhost myfunc ::: Yay, + env_parallel --env _ -S localhost myfunc ::: Hooray @end verbatim In @strong{csh} @strong{--session} is not supported: @verbatim - # Record the "clean" environment (this only needs to be run once) + # Record the "clean" environment - this only needs to be run once env_parallel --record-env - # Optionally edit ~/.parallel/ignored_vars (only needed once) + # Optionally edit ~/.parallel/ignored_vars - only needed once # Define whatever you want to use - alias myalias 'echo \!* $myvar works.' - set myvar=it + alias myalias 'echo Aliases $myvar \!*.' + set myvar='and variables' # Use --env _ to only transfer the names not in the "empty" environment - env_parallel --env _ -S localhost myalias ::: Yay, + env_parallel --env _ -S localhost myalias ::: work @end verbatim @menu @@ -1079,8 +1079,8 @@ When using GNU @strong{env_parallel} for a publication please cite: -O. Tange (2011): GNU Parallel - The Command-Line Power Tool, ;login: -The USENIX Magazine, February 2011:42-47. +O. Tange (2018): GNU Parallel 2018, March 2018, ISBN 9781387509881, +DOI: 10.5281/zenodo.1146014. This helps funding further development; and it won't cost you a cent. If you pay 10000 EUR you should feel free to use GNU Parallel without citing. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/src/niceload new/parallel-20200922/src/niceload --- old/parallel-20200822/src/niceload 2020-08-23 01:20:56.000000000 +0200 +++ new/parallel-20200922/src/niceload 2020-09-23 10:09:33.000000000 +0200 @@ -23,7 +23,7 @@ use strict; use Getopt::Long; $Global::progname="niceload"; -$Global::version = 20200822; +$Global::version = 20200922; Getopt::Long::Configure("bundling","require_order"); get_options_from_array(\@ARGV) || die_usage(); if($opt::version) { @@ -1147,7 +1147,9 @@ my @iostat; for(reverse @iostat_out) { /Device/ and last; - push @iostat, (split(/\s+/,$_))[13]; + my @col = (split(/\s+/,$_)); + # Util% is last column + push @iostat, pop @col; } my $io = ::max(@iostat); return undef_as_zero($io)/10; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/src/parallel new/parallel-20200922/src/parallel --- old/parallel-20200822/src/parallel 2020-08-23 01:20:56.000000000 +0200 +++ new/parallel-20200922/src/parallel 2020-09-23 10:09:33.000000000 +0200 @@ -2160,7 +2160,7 @@ sub init_globals() { # Defaults: - $Global::version = 20200822; + $Global::version = 20200922; $Global::progname = 'parallel'; $::name = "GNU Parallel"; $Global::infinity = 2**31; @@ -4919,8 +4919,8 @@ "If you use programs that use GNU Parallel to process data for an article in a", "scientific publication, please cite:", "", - " Tange, O. (2020, August 22). GNU Parallel 20200822 ('Beirut').", - " Zenodo. https://doi.org/10.5281/zenodo.3996295", + " Tange, O. (2020, September 22). GNU Parallel 20200922 ('Ginsburg').", + " Zenodo. https://doi.org/10.5281/zenodo.4045386", "", # Before changing this line, please read # https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice @@ -4950,8 +4950,8 @@ "If you use programs that use GNU Parallel to process data for an article in a", "scientific publication, please cite:", "", - " Tange, O. (2020, August 22). GNU Parallel 20200822 ('Beirut').", - " Zenodo. https://doi.org/10.5281/zenodo.3996295", + " Tange, O. (2020, September 22). GNU Parallel 20200922 ('Ginsburg').", + " Zenodo. https://doi.org/10.5281/zenodo.4045386", "", # Before changing this line, please read # https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice and @@ -5064,20 +5064,20 @@ "If you use programs that use GNU Parallel to process data for an article in a", "scientific publication, please cite:", "", - "\@software{tange_2020_3996295,", + "\@software{tange_2020_4045386,", " author = {Tange, Ole},", - " title = {GNU Parallel 20200822 ('Beirut')},", - " month = Aug,", + " title = {GNU Parallel 20200922 ('Ginsburg')},", + " month = Sep,", " 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.3996295},", - " url = {https://doi.org/10.5281/zenodo.3996295}", + " doi = {10.5281/zenodo.4045386},", + " url = {https://doi.org/10.5281/zenodo.4045386}", "}", "", - "(Feel free to use \\nocite{tange_2020_3996295})", + "(Feel free to use \\nocite{tange_2020_4045386})", "", # Before changing this line, please read # https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice and @@ -7387,19 +7387,37 @@ # 'threads' => #threads # 'active' => #taskset_threads } my $cpu = shift; - local $/ = "\n"; # If delimiter is set, then $/ will be wrong - my @cpuinfo; - if($ENV{'PARALLEL_CPUINFO'}) { - # Use CPUINFO from environment - used for testing only - @cpuinfo = split/(?<=\n)/,$ENV{'PARALLEL_CPUINFO'}; - } elsif($cpu->{'sockets'} and $cpu->{'cores'} and - $cpu->{'threads'}) { - # Skip /proc/cpuinfo - already set - } elsif(open(my $in_fh, "<", "/proc/cpuinfo")) { - # Read /proc/cpuinfo - @cpuinfo = <$in_fh>; + + sub read_topology($) { + my $prefix = shift; + my %sibiling; + my %socket; + my $thread; + for($thread = 0; + -r "$prefix/cpu$thread/topology/physical_package_id"; + $thread++) { + open(my $fh,"<", + "$prefix/cpu$thread/topology/physical_package_id") + || die; + $socket{<$fh>}++; + close $fh; + } + for($thread = 0; + -r "$prefix/cpu$thread/topology/thread_siblings"; + $thread++) { + open(my $fh,"<", + "$prefix/cpu$thread/topology/thread_siblings") + || die; + $sibiling{<$fh>}++; + close $fh; + } + $cpu->{'sockets'} = keys %socket; + $cpu->{'cores'} = keys %sibiling; + $cpu->{'threads'} = $thread; } - if(@cpuinfo) { + + sub read_cpuinfo(@) { + my @cpuinfo = @_; $cpu->{'sockets'} = 0; $cpu->{'cores'} = 0; $cpu->{'threads'} = 0; @@ -7407,18 +7425,76 @@ my %phy_seen; my $physicalid; for(@cpuinfo) { + # physical id : 0 if(/^physical id.*[:](.*)/) { $physicalid = $1; if(not $phy_seen{$1}++) { $cpu->{'sockets'}++; } } + # core id : 3 if(/^core id.*[:](.*)/ and not $seen{$physicalid,$1}++) { $cpu->{'cores'}++; } - /^processor.*[:]/i and $cpu->{'threads'}++; + # processor : 2 + /^processor.*[:]\s*\d/i and $cpu->{'threads'}++; + } + $cpu->{'cores'} ||= $cpu->{'threads'}; + $cpu->{'cpus'} ||= $cpu->{'threads'}; + $cpu->{'sockets'} ||= 1; + } + + sub read_lscpu(@) { + my @lscpu = @_; + my $threads_per_core; + my $cores_per_socket; + for(@lscpu) { + /^CPU.s.:\s*(\d+)/ and $cpu->{'threads'} = $1; + /^Thread.s. per core:\s*(\d+)/ and $threads_per_core = $1; + /^Core.s. per socket:\s*(\d+)/ and $cores_per_socket = $1; + /^(CPU )?Socket.s.:\s*(\d+)/i and $cpu->{'sockets'} = $2; + } + if($threads_per_core and $cpu->{'threads'}) { + $cpu->{'cores'} = $cpu->{'threads'} / $threads_per_core; + } + $cpu->{'cpus'} ||= $cpu->{'threads'}; + } + + local $/ = "\n"; # If delimiter is set, then $/ will be wrong + my @cpuinfo; + my @lscpu; + if($ENV{'PARALLEL_CPUINFO'}) { + # Use CPUINFO from environment - used for testing only + read_cpuinfo(split/(?<=\n)/,$ENV{'PARALLEL_CPUINFO'}); + } elsif($ENV{'PARALLEL_LSCPU'}) { + # Use LSCPU from environment - used for testing only + read_lscpu(split/(?<=\n)/,$ENV{'PARALLEL_LSCPU'}); + } elsif(-r "$ENV{'PARALLEL_CPUPREFIX'}/cpu0/topology/thread_siblings") { + # Use CPUPREFIX from environment - used for testing only + read_topology($ENV{'PARALLEL_CPUPREFIX'}); + } elsif($cpu->{'sockets'} and $cpu->{'cores'} and $cpu->{'threads'}) { + # Skip /proc/cpuinfo - already set + } else { + # Not debugging: Look at this computer + if(!($cpu->{'sockets'} and $cpu->{'cores'} and $cpu->{'threads'}) + and + open(my $in_fh, "-|", "lscpu")) { + # Parse output from lscpu + read_lscpu(<$in_fh>); + close $in_fh; + } + if(!($cpu->{'sockets'} and $cpu->{'cores'} and $cpu->{'threads'}) + and + -r "/sys/devices/system/cpu/cpu0/topology/thread_siblings") { + read_topology("/sys/devices/system/cpu"); + } + if(!($cpu->{'sockets'} and $cpu->{'cores'} and $cpu->{'threads'}) + and + open(my $in_fh, "<", "/proc/cpuinfo")) { + # Read /proc/cpuinfo + read_cpuinfo(<$in_fh>); + close $in_fh; } - $cpu->{'cores'} ||= $cpu->{'threads'} || $cpu->{'sockets'}; } if(-e "/proc/self/status" and not $ENV{'PARALLEL_CPUINFO'}) { # if 'taskset' is used to limit number of threads @@ -7836,7 +7912,9 @@ if(not $rsync) { my @out = `rsync --version`; for (@out) { - if(/version (\d+.\d+)(.\d+)?/) { + # rsync version 3.1.3 protocol version 31 + # rsync version v3.2.3 protocol version 31 + if(/version v?(\d+.\d+)(.\d+)?/) { if($1 >= 3.1) { # Version 3.1.0 or later: Downgrade to protocol 30 $rsync = "rsync --protocol 30"; @@ -10517,7 +10595,7 @@ my $envc = (keys %ENV); my $envn = length join"",(keys %ENV); my $envv = length join"",(values %ENV); - $darwin_max_len = 3+($max_len - $envn - $envv)/5 - $envc*2; + $darwin_max_len = -146+($max_len - $envn - $envv) - $envc*10; ::debug("init", "length: $darwin_max_len ". "3+($max_len - $envn - $envv)/5 - $envc*2"); @@ -10838,6 +10916,8 @@ # Length of command w/ all replacement args removed $len += $self->{'len'}{'noncontext'} + @{$self->{'command'}} -1; ::debug("length", "noncontext + command: $len\n"); + # MacOS has an overhead of 8 bytes per argument + my $darwin = ($^O eq "darwin") ? 8 : 0; my $recargs = $self->number_of_recargs(); if($self->{'context_replace'}) { # Context is duplicated for each arg @@ -10856,16 +10936,23 @@ " Groups: ", $self->{'len'}{'noncontextgroups'}, "\n"); # Add space between context groups $len += ($recargs-1) * ($self->{'len'}{'contextgroups'}); + if($darwin) { + $len += $recargs * $self->{'len'}{'contextgroups'} * $darwin; + } } else { # Each replacement string may occur several times # Add the length for each time $len += 1*$self->{'len'}{'context'}; ::debug("length", "context+noncontext + command: $len\n"); for my $replstring (keys %{$self->{'replacecount'}}) { - # (space between regargs + length of replacement) + # (space between recargs + length of replacement) # * number this replacement is used $len += ($recargs -1 + $self->{'len'}{$replstring}) * $self->{'replacecount'}{$replstring}; + if($darwin) { + $len += ($recargs * $self->{'replacecount'}{$replstring} + * $darwin); + } } } if(defined $Global::parallel_env) { @@ -12864,8 +12951,15 @@ my $parallel_locks = $Global::cache_dir . "/semaphores"; -d $parallel_locks or ::mkdir_or_die($parallel_locks); my $lockdir = "$parallel_locks/$id"; - my $lockfile = $lockdir.".lock"; + if(-d $parallel_locks and -w $parallel_locks + and -r $parallel_locks and -x $parallel_locks) { + # skip + } else { + ::error("Semaphoredir must be writable: '$parallel_locks'"); + ::wait_and_exit(255); + } + if($count < 1) { ::die_bug("semaphore-count: $count"); } return bless { 'lockfile' => $lockfile, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/src/parallel_design.7 new/parallel-20200922/src/parallel_design.7 --- old/parallel-20200822/src/parallel_design.7 2019-11-21 23:56:08.000000000 +0100 +++ new/parallel-20200922/src/parallel_design.7 2020-09-21 20:07:31.000000000 +0200 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 4.09 (Pod::Simple 3.35) +.\" Automatically generated by Pod::Man 4.11 (Pod::Simple 3.40) .\" .\" Standard preamble: .\" ======================================================================== @@ -54,16 +54,20 @@ .\" Avoid warning from groff about undefined register 'F'. .de IX .. -.if !\nF .nr F 0 -.if \nF>0 \{\ -. de IX -. tm Index:\\$1\t\\n%\t"\\$2" +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{\ +. if \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" .. -. if !\nF==2 \{\ -. nr % 0 -. nr F 2 +. if !\nF==2 \{\ +. nr % 0 +. nr F 2 +. \} . \} .\} +.rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. @@ -129,7 +133,7 @@ .\" ======================================================================== .\" .IX Title "PARALLEL_DESIGN 7" -.TH PARALLEL_DESIGN 7 "2019-11-21" "20191022" "parallel" +.TH PARALLEL_DESIGN 7 "2020-09-19" "20200822" "parallel" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l @@ -676,7 +680,7 @@ .IX Subsection "Shell shock" The shell shock bug in \fBbash\fR did not affect \s-1GNU\s0 \fBparallel\fR, but the solutions did. \fBbash\fR first introduced functions in variables named: -\&\fI\fIBASH_FUNC_myfunc()\fI\fR and later changed that to \fIBASH_FUNC_myfunc%%\fR. When +\&\fI\f(BIBASH_FUNC_myfunc()\fI\fR and later changed that to \fIBASH_FUNC_myfunc%%\fR. When transferring functions \s-1GNU\s0 \fBparallel\fR reads off the function and changes that into a function definition, which is copied to the remote system and executed before the actual command is executed. Therefore \s-1GNU\s0 \fBparallel\fR @@ -713,6 +717,9 @@ if the parent pid becomes 1, then Ctrl-C works and stderr is kept on stderr. .PP +Ctrl-C does, however, kill the ssh connection, so any output from +a remote dying process is lost. +.PP To be able to kill all (grand)*children a new process group is started. .PP @@ -1153,7 +1160,7 @@ sources. .IP "\(bu" 3 Computing the number of jobs. \fB\-\-bar\fR, \fB\-\-eta\fR, and \fB\-\-halt xx%\fR -use \fB\f(BItotal_jobs()\fB\fR to compute the total number of jobs. It does this +use \fB\fBtotal_jobs()\fB\fR to compute the total number of jobs. It does this by generating the data structures for all jobs. All these job data structures will be stored in memory and take up around 400 bytes/job. .IP "\(bu" 3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/src/parallel_design.html new/parallel-20200922/src/parallel_design.html --- old/parallel-20200822/src/parallel_design.html 2020-08-23 01:22:17.000000000 +0200 +++ new/parallel-20200922/src/parallel_design.html 2020-09-21 20:07:31.000000000 +0200 @@ -557,6 +557,8 @@ <p>So what is needed is a way to have both. It seems the reason why Ctrl-C does not kill the remote jobs is because the shell does not propagate the hang-up signal from <b>sshd</b>. But when <b>sshd</b> dies, the parent of the login shell becomes <b>init</b> (process id 1). So by exec'ing a Perl wrapper to monitor the parent pid and kill the child if the parent pid becomes 1, then Ctrl-C works and stderr is kept on stderr.</p> +<p>Ctrl-C does, however, kill the ssh connection, so any output from a remote dying process is lost.</p> + <p>To be able to kill all (grand)*children a new process group is started.</p> <h3 id="nice">--nice</h3> Binary files old/parallel-20200822/src/parallel_design.pdf and new/parallel-20200922/src/parallel_design.pdf differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/src/parallel_design.pod new/parallel-20200922/src/parallel_design.pod --- old/parallel-20200822/src/parallel_design.pod 2019-11-21 23:50:36.000000000 +0100 +++ new/parallel-20200922/src/parallel_design.pod 2020-09-20 00:33:07.000000000 +0200 @@ -652,9 +652,13 @@ if the parent pid becomes 1, then Ctrl-C works and stderr is kept on stderr. +Ctrl-C does, however, kill the ssh connection, so any output from +a remote dying process is lost. + To be able to kill all (grand)*children a new process group is started. + =head3 --nice B<nice>ing the remote process is done by B<setpriority(0,0,$nice)>. A diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/src/parallel_design.texi new/parallel-20200922/src/parallel_design.texi --- old/parallel-20200822/src/parallel_design.texi 2020-04-21 19:43:25.000000000 +0200 +++ new/parallel-20200922/src/parallel_design.texi 2020-09-21 20:07:32.000000000 +0200 @@ -735,6 +735,9 @@ if the parent pid becomes 1, then Ctrl-C works and stderr is kept on stderr. +Ctrl-C does, however, kill the ssh connection, so any output from +a remote dying process is lost. + To be able to kill all (grand)*children a new process group is started. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/src/parcat.1 new/parallel-20200922/src/parcat.1 --- old/parallel-20200822/src/parcat.1 2020-02-22 20:04:55.000000000 +0100 +++ new/parallel-20200922/src/parcat.1 2020-08-23 12:35:39.000000000 +0200 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 4.09 (Pod::Simple 3.35) +.\" Automatically generated by Pod::Man 4.11 (Pod::Simple 3.40) .\" .\" Standard preamble: .\" ======================================================================== @@ -54,16 +54,20 @@ .\" Avoid warning from groff about undefined register 'F'. .de IX .. -.if !\nF .nr F 0 -.if \nF>0 \{\ -. de IX -. tm Index:\\$1\t\\n%\t"\\$2" +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{\ +. if \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" .. -. if !\nF==2 \{\ -. nr % 0 -. nr F 2 +. if !\nF==2 \{\ +. nr % 0 +. nr F 2 +. \} . \} .\} +.rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. @@ -129,7 +133,7 @@ .\" ======================================================================== .\" .IX Title "PARCAT 1" -.TH PARCAT 1 "2020-01-27" "20200122" "parallel" +.TH PARCAT 1 "2020-08-23" "20200822" "parallel" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l @@ -149,6 +153,12 @@ \& (cat file1 & cat file2 &) | ... .Ve .PP +It is faster than doing: +.PP +.Vb 1 +\& parallel \-j0 \-\-lb cat ::: file* +.Ve +.PP Arguments can be given on the command line or passed in on stdin (standard input). .SH "OPTIONS" @@ -172,14 +182,16 @@ .IX Header "EXAMPLES" .SS "Simple line buffered output" .IX Subsection "Simple line buffered output" -\&\s-1GNU\s0 \fBparallel\fR saves output to tempfiles. If the amount of data is -bigger than the free disk space, then you can use this technique to do -line buffering without saving to disk: +\&\fBtraceroute\fR will often print half a line. If run in parallel, two +instances may half-lines of their output. This can be avoided by +saving the output to a fifo and then using \fBparcat\fR to read the two +fifos in parallel: .PP -.Vb 3 -\& mkfifo slot\-{1..5} -\& seq 10000000 | parallel \-j5 \-\-round \-\-pipe \*(Aqcat > slot\-{%}\*(Aq & -\& parcat slot\-{1..5} | wc +.Vb 4 +\& mkfifo freenetproject.org.fifo tange.dk.fifo +\& traceroute freenetproject.org > freenetproject.org.fifo & +\& traceroute tange.dk > tange.dk.fifo & +\& parcat \-\-rm *fifo .Ve .SH "REPORTING BUGS" .IX Header "REPORTING BUGS" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/src/parcat.html new/parallel-20200922/src/parcat.html --- old/parallel-20200822/src/parcat.html 2020-08-23 01:22:17.000000000 +0200 +++ new/parallel-20200922/src/parcat.html 2020-09-23 10:10:06.000000000 +0200 @@ -47,6 +47,10 @@ <pre><code> (cat file1 & cat file2 &) | ...</code></pre> +<p>It is faster than doing:</p> + +<pre><code> parallel -j0 --lb cat ::: file*</code></pre> + <p>Arguments can be given on the command line or passed in on stdin (standard input).</p> <h1 id="OPTIONS">OPTIONS</h1> @@ -75,11 +79,12 @@ <h2 id="Simple-line-buffered-output">Simple line buffered output</h2> -<p>GNU <b>parallel</b> saves output to tempfiles. If the amount of data is bigger than the free disk space, then you can use this technique to do line buffering without saving to disk:</p> +<p><b>traceroute</b> will often print half a line. If run in parallel, two instances may half-lines of their output. This can be avoided by saving the output to a fifo and then using <b>parcat</b> to read the two fifos in parallel:</p> -<pre><code> mkfifo slot-{1..5} - seq 10000000 | parallel -j5 --round --pipe 'cat > slot-{%}' & - parcat slot-{1..5} | wc</code></pre> +<pre><code> mkfifo freenetproject.org.fifo tange.dk.fifo + traceroute freenetproject.org > freenetproject.org.fifo & + traceroute tange.dk > tange.dk.fifo & + parcat --rm *fifo</code></pre> <h1 id="REPORTING-BUGS">REPORTING BUGS</h1> Binary files old/parallel-20200822/src/parcat.pdf and new/parallel-20200922/src/parcat.pdf differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/src/parcat.pod new/parallel-20200922/src/parcat.pod --- old/parallel-20200822/src/parcat.pod 2020-01-27 18:17:31.000000000 +0100 +++ new/parallel-20200922/src/parcat.pod 2020-08-23 12:35:33.000000000 +0200 @@ -16,6 +16,10 @@ (cat file1 & cat file2 &) | ... +It is faster than doing: + + parallel -j0 --lb cat ::: file* + Arguments can be given on the command line or passed in on stdin (standard input). @@ -44,13 +48,16 @@ =head2 Simple line buffered output -GNU B<parallel> saves output to tempfiles. If the amount of data is -bigger than the free disk space, then you can use this technique to do -line buffering without saving to disk: - - mkfifo slot-{1..5} - seq 10000000 | parallel -j5 --round --pipe 'cat > slot-{%}' & - parcat slot-{1..5} | wc +B<traceroute> will often print half a line. If run in parallel, two +instances may half-lines of their output. This can be avoided by +saving the output to a fifo and then using B<parcat> to read the two +fifos in parallel: + + mkfifo freenetproject.org.fifo tange.dk.fifo + traceroute freenetproject.org > freenetproject.org.fifo & + traceroute tange.dk > tange.dk.fifo & + parcat --rm *fifo + =head1 REPORTING BUGS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/src/parcat.texi new/parallel-20200922/src/parcat.texi --- old/parallel-20200822/src/parcat.texi 2020-04-21 19:43:24.000000000 +0200 +++ new/parallel-20200922/src/parcat.texi 2020-08-23 12:35:41.000000000 +0200 @@ -42,6 +42,12 @@ (cat file1 & cat file2 &) | ... @end verbatim +It is faster than doing: + +@verbatim + parallel -j0 --lb cat ::: file* +@end verbatim + Arguments can be given on the command line or passed in on stdin (standard input). @@ -80,14 +86,16 @@ @node Simple line buffered output @section Simple line buffered output -GNU @strong{parallel} saves output to tempfiles. If the amount of data is -bigger than the free disk space, then you can use this technique to do -line buffering without saving to disk: +@strong{traceroute} will often print half a line. If run in parallel, two +instances may half-lines of their output. This can be avoided by +saving the output to a fifo and then using @strong{parcat} to read the two +fifos in parallel: @verbatim - mkfifo slot-{1..5} - seq 10000000 | parallel -j5 --round --pipe 'cat > slot-{%}' & - parcat slot-{1..5} | wc + mkfifo freenetproject.org.fifo tange.dk.fifo + traceroute freenetproject.org > freenetproject.org.fifo & + traceroute tange.dk > tange.dk.fifo & + parcat --rm *fifo @end verbatim @node REPORTING BUGS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/src/parsort new/parallel-20200922/src/parsort --- old/parallel-20200822/src/parsort 2020-04-22 18:17:02.000000000 +0200 +++ new/parallel-20200922/src/parsort 2020-08-23 12:12:11.000000000 +0200 @@ -117,7 +117,7 @@ "help" => \$opt::dummy, ) || exit(255); $Global::progname = ($0 =~ m:(^|/)([^/]+)$:)[1]; -$Global::version = 20200412; +$Global::version = 20200823; if($opt::version) { version(); exit 0; } @Global::sortoptions = @ARGV_before[0..($#ARGV_before-$#ARGV-1)]; #if($opt::zero_terminated) { $/ = "\0"; } @@ -256,6 +256,20 @@ return wantarray ? @which : $which[0]; } +sub version() { + # Returns: N/A + print join + ("\n", + "GNU $Global::progname $Global::version", + "Copyright (C) 2020 Ole Tange, http://ole.tange.dk and Free Software", + "Foundation, Inc.", + "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>", + "This is free software: you are free to change and redistribute it.", + "GNU $Global::progname comes with no warranty.", + "", + "Web site: https://www.gnu.org/software/parallel\n", + ); +} if(@ARGV) { sort_files(@ARGV); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/src/parsort.1 new/parallel-20200922/src/parsort.1 --- old/parallel-20200822/src/parsort.1 2020-04-22 18:17:09.000000000 +0200 +++ new/parallel-20200922/src/parsort.1 2020-08-23 12:35:39.000000000 +0200 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 4.09 (Pod::Simple 3.35) +.\" Automatically generated by Pod::Man 4.11 (Pod::Simple 3.40) .\" .\" Standard preamble: .\" ======================================================================== @@ -54,16 +54,20 @@ .\" Avoid warning from groff about undefined register 'F'. .de IX .. -.if !\nF .nr F 0 -.if \nF>0 \{\ -. de IX -. tm Index:\\$1\t\\n%\t"\\$2" +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{\ +. if \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" .. -. if !\nF==2 \{\ -. nr % 0 -. nr F 2 +. if !\nF==2 \{\ +. nr % 0 +. nr F 2 +. \} . \} .\} +.rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. @@ -129,7 +133,7 @@ .\" ======================================================================== .\" .IX Title "PARSORT 1" -.TH PARSORT 1 "2020-04-22" "20200322" "parallel" +.TH PARSORT 1 "2020-08-23" "20200822" "parallel" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l Binary files old/parallel-20200822/src/parsort.pdf and new/parallel-20200922/src/parsort.pdf differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/src/sem new/parallel-20200922/src/sem --- old/parallel-20200822/src/sem 2020-08-23 01:20:56.000000000 +0200 +++ new/parallel-20200922/src/sem 2020-09-23 10:09:33.000000000 +0200 @@ -2160,7 +2160,7 @@ sub init_globals() { # Defaults: - $Global::version = 20200822; + $Global::version = 20200922; $Global::progname = 'parallel'; $::name = "GNU Parallel"; $Global::infinity = 2**31; @@ -4919,8 +4919,8 @@ "If you use programs that use GNU Parallel to process data for an article in a", "scientific publication, please cite:", "", - " Tange, O. (2020, August 22). GNU Parallel 20200822 ('Beirut').", - " Zenodo. https://doi.org/10.5281/zenodo.3996295", + " Tange, O. (2020, September 22). GNU Parallel 20200922 ('Ginsburg').", + " Zenodo. https://doi.org/10.5281/zenodo.4045386", "", # Before changing this line, please read # https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice @@ -4950,8 +4950,8 @@ "If you use programs that use GNU Parallel to process data for an article in a", "scientific publication, please cite:", "", - " Tange, O. (2020, August 22). GNU Parallel 20200822 ('Beirut').", - " Zenodo. https://doi.org/10.5281/zenodo.3996295", + " Tange, O. (2020, September 22). GNU Parallel 20200922 ('Ginsburg').", + " Zenodo. https://doi.org/10.5281/zenodo.4045386", "", # Before changing this line, please read # https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice and @@ -5064,20 +5064,20 @@ "If you use programs that use GNU Parallel to process data for an article in a", "scientific publication, please cite:", "", - "\@software{tange_2020_3996295,", + "\@software{tange_2020_4045386,", " author = {Tange, Ole},", - " title = {GNU Parallel 20200822 ('Beirut')},", - " month = Aug,", + " title = {GNU Parallel 20200922 ('Ginsburg')},", + " month = Sep,", " 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.3996295},", - " url = {https://doi.org/10.5281/zenodo.3996295}", + " doi = {10.5281/zenodo.4045386},", + " url = {https://doi.org/10.5281/zenodo.4045386}", "}", "", - "(Feel free to use \\nocite{tange_2020_3996295})", + "(Feel free to use \\nocite{tange_2020_4045386})", "", # Before changing this line, please read # https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice and @@ -7387,19 +7387,37 @@ # 'threads' => #threads # 'active' => #taskset_threads } my $cpu = shift; - local $/ = "\n"; # If delimiter is set, then $/ will be wrong - my @cpuinfo; - if($ENV{'PARALLEL_CPUINFO'}) { - # Use CPUINFO from environment - used for testing only - @cpuinfo = split/(?<=\n)/,$ENV{'PARALLEL_CPUINFO'}; - } elsif($cpu->{'sockets'} and $cpu->{'cores'} and - $cpu->{'threads'}) { - # Skip /proc/cpuinfo - already set - } elsif(open(my $in_fh, "<", "/proc/cpuinfo")) { - # Read /proc/cpuinfo - @cpuinfo = <$in_fh>; + + sub read_topology($) { + my $prefix = shift; + my %sibiling; + my %socket; + my $thread; + for($thread = 0; + -r "$prefix/cpu$thread/topology/physical_package_id"; + $thread++) { + open(my $fh,"<", + "$prefix/cpu$thread/topology/physical_package_id") + || die; + $socket{<$fh>}++; + close $fh; + } + for($thread = 0; + -r "$prefix/cpu$thread/topology/thread_siblings"; + $thread++) { + open(my $fh,"<", + "$prefix/cpu$thread/topology/thread_siblings") + || die; + $sibiling{<$fh>}++; + close $fh; + } + $cpu->{'sockets'} = keys %socket; + $cpu->{'cores'} = keys %sibiling; + $cpu->{'threads'} = $thread; } - if(@cpuinfo) { + + sub read_cpuinfo(@) { + my @cpuinfo = @_; $cpu->{'sockets'} = 0; $cpu->{'cores'} = 0; $cpu->{'threads'} = 0; @@ -7407,18 +7425,76 @@ my %phy_seen; my $physicalid; for(@cpuinfo) { + # physical id : 0 if(/^physical id.*[:](.*)/) { $physicalid = $1; if(not $phy_seen{$1}++) { $cpu->{'sockets'}++; } } + # core id : 3 if(/^core id.*[:](.*)/ and not $seen{$physicalid,$1}++) { $cpu->{'cores'}++; } - /^processor.*[:]/i and $cpu->{'threads'}++; + # processor : 2 + /^processor.*[:]\s*\d/i and $cpu->{'threads'}++; + } + $cpu->{'cores'} ||= $cpu->{'threads'}; + $cpu->{'cpus'} ||= $cpu->{'threads'}; + $cpu->{'sockets'} ||= 1; + } + + sub read_lscpu(@) { + my @lscpu = @_; + my $threads_per_core; + my $cores_per_socket; + for(@lscpu) { + /^CPU.s.:\s*(\d+)/ and $cpu->{'threads'} = $1; + /^Thread.s. per core:\s*(\d+)/ and $threads_per_core = $1; + /^Core.s. per socket:\s*(\d+)/ and $cores_per_socket = $1; + /^(CPU )?Socket.s.:\s*(\d+)/i and $cpu->{'sockets'} = $2; + } + if($threads_per_core and $cpu->{'threads'}) { + $cpu->{'cores'} = $cpu->{'threads'} / $threads_per_core; + } + $cpu->{'cpus'} ||= $cpu->{'threads'}; + } + + local $/ = "\n"; # If delimiter is set, then $/ will be wrong + my @cpuinfo; + my @lscpu; + if($ENV{'PARALLEL_CPUINFO'}) { + # Use CPUINFO from environment - used for testing only + read_cpuinfo(split/(?<=\n)/,$ENV{'PARALLEL_CPUINFO'}); + } elsif($ENV{'PARALLEL_LSCPU'}) { + # Use LSCPU from environment - used for testing only + read_lscpu(split/(?<=\n)/,$ENV{'PARALLEL_LSCPU'}); + } elsif(-r "$ENV{'PARALLEL_CPUPREFIX'}/cpu0/topology/thread_siblings") { + # Use CPUPREFIX from environment - used for testing only + read_topology($ENV{'PARALLEL_CPUPREFIX'}); + } elsif($cpu->{'sockets'} and $cpu->{'cores'} and $cpu->{'threads'}) { + # Skip /proc/cpuinfo - already set + } else { + # Not debugging: Look at this computer + if(!($cpu->{'sockets'} and $cpu->{'cores'} and $cpu->{'threads'}) + and + open(my $in_fh, "-|", "lscpu")) { + # Parse output from lscpu + read_lscpu(<$in_fh>); + close $in_fh; + } + if(!($cpu->{'sockets'} and $cpu->{'cores'} and $cpu->{'threads'}) + and + -r "/sys/devices/system/cpu/cpu0/topology/thread_siblings") { + read_topology("/sys/devices/system/cpu"); + } + if(!($cpu->{'sockets'} and $cpu->{'cores'} and $cpu->{'threads'}) + and + open(my $in_fh, "<", "/proc/cpuinfo")) { + # Read /proc/cpuinfo + read_cpuinfo(<$in_fh>); + close $in_fh; } - $cpu->{'cores'} ||= $cpu->{'threads'} || $cpu->{'sockets'}; } if(-e "/proc/self/status" and not $ENV{'PARALLEL_CPUINFO'}) { # if 'taskset' is used to limit number of threads @@ -7836,7 +7912,9 @@ if(not $rsync) { my @out = `rsync --version`; for (@out) { - if(/version (\d+.\d+)(.\d+)?/) { + # rsync version 3.1.3 protocol version 31 + # rsync version v3.2.3 protocol version 31 + if(/version v?(\d+.\d+)(.\d+)?/) { if($1 >= 3.1) { # Version 3.1.0 or later: Downgrade to protocol 30 $rsync = "rsync --protocol 30"; @@ -10517,7 +10595,7 @@ my $envc = (keys %ENV); my $envn = length join"",(keys %ENV); my $envv = length join"",(values %ENV); - $darwin_max_len = 3+($max_len - $envn - $envv)/5 - $envc*2; + $darwin_max_len = -146+($max_len - $envn - $envv) - $envc*10; ::debug("init", "length: $darwin_max_len ". "3+($max_len - $envn - $envv)/5 - $envc*2"); @@ -10838,6 +10916,8 @@ # Length of command w/ all replacement args removed $len += $self->{'len'}{'noncontext'} + @{$self->{'command'}} -1; ::debug("length", "noncontext + command: $len\n"); + # MacOS has an overhead of 8 bytes per argument + my $darwin = ($^O eq "darwin") ? 8 : 0; my $recargs = $self->number_of_recargs(); if($self->{'context_replace'}) { # Context is duplicated for each arg @@ -10856,16 +10936,23 @@ " Groups: ", $self->{'len'}{'noncontextgroups'}, "\n"); # Add space between context groups $len += ($recargs-1) * ($self->{'len'}{'contextgroups'}); + if($darwin) { + $len += $recargs * $self->{'len'}{'contextgroups'} * $darwin; + } } else { # Each replacement string may occur several times # Add the length for each time $len += 1*$self->{'len'}{'context'}; ::debug("length", "context+noncontext + command: $len\n"); for my $replstring (keys %{$self->{'replacecount'}}) { - # (space between regargs + length of replacement) + # (space between recargs + length of replacement) # * number this replacement is used $len += ($recargs -1 + $self->{'len'}{$replstring}) * $self->{'replacecount'}{$replstring}; + if($darwin) { + $len += ($recargs * $self->{'replacecount'}{$replstring} + * $darwin); + } } } if(defined $Global::parallel_env) { @@ -12864,8 +12951,15 @@ my $parallel_locks = $Global::cache_dir . "/semaphores"; -d $parallel_locks or ::mkdir_or_die($parallel_locks); my $lockdir = "$parallel_locks/$id"; - my $lockfile = $lockdir.".lock"; + if(-d $parallel_locks and -w $parallel_locks + and -r $parallel_locks and -x $parallel_locks) { + # skip + } else { + ::error("Semaphoredir must be writable: '$parallel_locks'"); + ::wait_and_exit(255); + } + if($count < 1) { ::die_bug("semaphore-count: $count"); } return bless { 'lockfile' => $lockfile, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/parallel-20200822/src/sql new/parallel-20200922/src/sql --- old/parallel-20200822/src/sql 2020-08-23 01:20:56.000000000 +0200 +++ new/parallel-20200922/src/sql 2020-09-23 10:09:33.000000000 +0200 @@ -574,7 +574,7 @@ exit ($err); sub parse_options { - $Global::version = 20200822; + $Global::version = 20200922; $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-20200822/src/sql.1 new/parallel-20200922/src/sql.1 --- old/parallel-20200822/src/sql.1 2020-08-23 01:22:15.000000000 +0200 +++ new/parallel-20200922/src/sql.1 2020-09-23 10:10:04.000000000 +0200 @@ -133,7 +133,7 @@ .\" ======================================================================== .\" .IX Title "SQL 1" -.TH SQL 1 "2020-08-22" "20200822" "parallel" +.TH SQL 1 "2020-09-23" "20200922" "parallel" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l ++++++ parallel-20200822.tar.bz2.sig -> parallel-20200922.tar.bz2.sig ++++++ --- /work/SRC/openSUSE:Factory/gnu_parallel/parallel-20200822.tar.bz2.sig 2020-09-06 00:04:54.759329263 +0200 +++ /work/SRC/openSUSE:Factory/.gnu_parallel.new.4249/parallel-20200922.tar.bz2.sig 2020-10-10 19:05:18.324513250 +0200 @@ -2,7 +2,7 @@ # To check the signature run: # echo | gpg -# gpg --auto-key-locate keyserver --keyserver-options auto-key-retrieve parallel-20200822.tar.bz2.sig +# gpg --auto-key-locate keyserver --keyserver-options auto-key-retrieve parallel-20200922.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----- -iQUHBAABCgAdFiEEzaAaQgjE90UGEH570atFFoiIiIgFAl9BqNwACgkQ0atFFoiI -iIjW5SafQ8ffeX3UuWUAqCqhdkdsqnmNNVcS4xXYPdOpOlr8ttVODuVdzk4kPpVP -IOMnmN0VEPm2rbzXxF6CuX5IFySKZ913hWPdzxpzWF6gchtZUJyO+dp9kERFqbrm -UW8a+RgBc4gdNPRjyii3724jf+IZ4BLurtyJdcqzVv8BoWpUlY0mKdHr5fLm1FEk -l9D1VOqjqjPpufU6ZdTpEv5WDuOlMnEZXTM4NTHe7Iv95oMW9GwvPXnBvuoOr5Tj -EECdYtM1d4TLSKis8Vmq7igppbd+HKThBDPt64yUPfaXAIWwEuE2pOIZygzFtLgz -bOFANjwndUDjRx+8tW3jkzUeDUFXvq9eOtmUMc6x+9IG0KJ6MVc8EsAVHVwCZeP/ -iJpGjzPYzr0j6wPMyTPrEDMw5vWbNjAUo19Xmsaci97k+Fh7OpUC00OtBR4M1ebm -MYI89hGu8FxIler4uhhEZibj4XGls7Ak3dm9hyyiEfhh5BiQ+YuII/snU6Y3PcXQ -+NX+qqeBoIU7XnRiHRDltPsDXfdCDp6W1HA9S9aDKlvK0YOzIQXsLachWDCLLmiQ -N6G3VnYjnwUsT2THJqGymKU11gg8KT4z3WxW4+ZwnpRGyt54+MI2H+PWuC43Z7U/ -YhgZQ/oJm+Sh8TmXv4MWat9rgeA18Opbk37XH8IqkWSnusMp+uS3VEcXO14VmxeX -4W7eAa0atuzddsZTkcktfPz7rSVVbBnIFJ6BVT5Dit1hM2u9UPccAilOq7GCEe8M -wlu6u/TC6ouK8SIqgfAqUNSxk/OGpHY/IM5ZgXuDvXwK+YUkPyveXV1JfbKSM3fk -cMFHSpNDCBdUzq3XELun4Rik2YjjDo1y7DouRMBf3LrN4R7BXzJBNeK87HQXO7E/ -Jtwjk9vkXjS67TMM3AVaBArSJDesTUabr2xWRqS7t19Ca0H/q7bdi/PitfA++uHH -8NJNSbZQqXOFc1/V7bXqb55Zwjc8K9Y94m2iFE/wsHfEPWB5a3bToVsdEg992SS7 -uKan/QjbBeVLKxYkykVdZwtpGaQv22sAckmYM2IsNp/7ehqdk1pMKpB6q8N2lMaL -RQx/xb13CxQ9UsQcyUx2wKSn+O07JWySjFsvEkRkLJsJ3MxysttBxCTUZQ1wSBrt -QWPjZ5UyfaYZg4ZE3KuhdSdxDBB9xWRAWz0HC5t2FBZRqm9qpk4C9N2g8O0ATUPd -kuYBjEjwy39+wfKtwaR9Rn4KUykMiYXeWTI9vRLpodFcc+ERaR4rD+KWIjnSuPep -Ncz0h25854zaY3qHwiXyRvqHXVjFynayDkuIeBTKdk5boAtomt8xKrRFENMxZO9i -TEA+5p9/lnjJGO0PvvlrwjNp4yC4Gc3X1x8tLeuIcOIwyznLOL7rV9Ei4AijqEpB -zUqx8Xcd/8E/A/yPm/4D8/aZDg6R+Wgc6JzE0pSHdnqXMIc9niTNBm4rVZhUG/+n -BSHTzqrzbyAsWu448DjFOkGPMu2k9JsPUFoxHfUfXdjeqciZcSUflGCnAZSojDbc -gpNdJ5dcsb5hY2SjnGmPVhpJZSed+GyF1/O3b6q1p9QWIrDM6poDXnbLXhLBTMJu -DwXVkwBjA6QKU8XZPWTKwoy31/wnO1JS9c8pGE7A4m+3ykMZRB95WWAd -=49Te +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 -----END PGP SIGNATURE-----