mirror of
https://git.savannah.gnu.org/git/parallel.git
synced 2024-11-22 05:57:54 +00:00
parallel: --regexp . no longer matches \n. Allow for pre-record garbage.
This commit is contained in:
parent
97adff0293
commit
22244d765a
14
README
14
README
|
@ -40,13 +40,13 @@ installation.
|
||||||
|
|
||||||
$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
|
$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
|
||||||
fetch -o - http://pi.dk/3 ) > install.sh
|
fetch -o - http://pi.dk/3 ) > install.sh
|
||||||
$ sha1sum install.sh | grep 67bd7bc7dc20aff99eb8f1266574dadb
|
$ sha1sum install.sh | grep c82233e7da3166308632ac8c34f850c0
|
||||||
12345678 67bd7bc7 dc20aff9 9eb8f126 6574dadb
|
12345678 c82233e7 da316630 8632ac8c 34f850c0
|
||||||
$ md5sum install.sh | grep b7a15cdbb07fb6e11b0338577bc1780f
|
$ md5sum install.sh | grep ae3d7aac5e15cf3dfc87046cfc5918d2
|
||||||
b7a15cdb b07fb6e1 1b033857 7bc1780f
|
ae3d7aac 5e15cf3d fc87046c fc5918d2
|
||||||
$ sha512sum install.sh | grep 186000b62b66969d7506ca4f885e0c80e02a22444
|
$ sha512sum install.sh | grep dfc00d823137271a6d96225cea9e89f533ff6c81f
|
||||||
6f25960b d4b90cf6 ba5b76de c1acdf39 f3d24249 72930394 a4164351 93a7668d
|
9c5198d5 31a3b755 b7910ece 3a42d206 c804694d fc00d823 137271a6 d96225ce
|
||||||
21ff9839 6f920be5 186000b6 2b66969d 7506ca4f 885e0c80 e02a2244 40e8a43f
|
a9e89f53 3ff6c81f f52b298b ef9fb613 2d3f9ccd 0e2c7bd3 c35978b5 79acb5ca
|
||||||
$ bash install.sh
|
$ bash install.sh
|
||||||
|
|
||||||
This will literally install faster than reading the rest of this
|
This will literally install faster than reading the rest of this
|
||||||
|
|
|
@ -201,9 +201,9 @@ from:tange@gnu.org
|
||||||
to:parallel@gnu.org, bug-parallel@gnu.org
|
to:parallel@gnu.org, bug-parallel@gnu.org
|
||||||
stable-bcc: Jesse Alama <jessealama@fastmail.fm>
|
stable-bcc: Jesse Alama <jessealama@fastmail.fm>
|
||||||
|
|
||||||
Subject: GNU Parallel 20210322 ('Sarkozy/Sarah Everard/AstraZeneca/ Meghan<<>>') released <<[stable]>>
|
Subject: GNU Parallel 20210422 ('<<>>') released <<[stable]>>
|
||||||
|
|
||||||
GNU Parallel 20210322 ('2002-01-06') <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/
|
GNU Parallel 20210322 ('<<>>') <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/
|
||||||
|
|
||||||
<<No new functionality was introduced so this is a good candidate for a stable release.>>
|
<<No new functionality was introduced so this is a good candidate for a stable release.>>
|
||||||
|
|
||||||
|
@ -213,8 +213,7 @@ It does not have to be as detailed as Juan's. It is perfectly fine if you just s
|
||||||
|
|
||||||
Quote of the month:
|
Quote of the month:
|
||||||
|
|
||||||
GNU Parallel is my new favorite thing
|
<<>>
|
||||||
-- Will Tejeda @thewilltejeda
|
|
||||||
|
|
||||||
New in this release:
|
New in this release:
|
||||||
|
|
||||||
|
@ -222,33 +221,7 @@ New in this release:
|
||||||
|
|
||||||
News about GNU Parallel:
|
News about GNU Parallel:
|
||||||
|
|
||||||
* The very first version of Parallel dated 2002-01-06 was found in an
|
<<>>
|
||||||
old backup:
|
|
||||||
|
|
||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
$processes=shift;
|
|
||||||
|
|
||||||
chomp(@jobs=<>);
|
|
||||||
for (@jobs) {
|
|
||||||
$jobnr++;
|
|
||||||
push @makefile,
|
|
||||||
(".PHONY : job$jobnr\n",
|
|
||||||
"job$jobnr :\n",
|
|
||||||
"\t$_\n");
|
|
||||||
}
|
|
||||||
unshift @makefile, "all : ",(map { "job$_ " } 1 .. $jobnr),"\n";
|
|
||||||
|
|
||||||
open (MAKE, "| make -k -f - -j $processes") || die;
|
|
||||||
print MAKE @makefile;
|
|
||||||
close MAKE;
|
|
||||||
|
|
||||||
* Introduction to GNU Parallel https://www.youtube.com/watch?v=Kj-6JkAqw-8
|
|
||||||
|
|
||||||
* Using GNU Parallel with GooseSLURM https://readthedocs.org/projects/gooseslurm/downloads/pdf/latest/#chapter.7
|
|
||||||
|
|
||||||
* Why GNU-parallel?
|
|
||||||
https://github.com/lijingbu/omics/blob/main/why_gnu_parallel.md
|
|
||||||
|
|
||||||
Get the book: GNU Parallel 2018 http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html
|
Get the book: GNU Parallel 2018 http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html
|
||||||
|
|
||||||
|
@ -280,13 +253,13 @@ You can install GNU Parallel in just 10 seconds with:
|
||||||
|
|
||||||
$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
|
$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
|
||||||
fetch -o - http://pi.dk/3 ) > install.sh
|
fetch -o - http://pi.dk/3 ) > install.sh
|
||||||
$ sha1sum install.sh | grep 3374ec53bacb199b245af2dda86df6c9
|
$ sha1sum install.sh | grep c82233e7da3166308632ac8c34f850c0
|
||||||
12345678 3374ec53 bacb199b 245af2dd a86df6c9
|
12345678 c82233e7 da316630 8632ac8c 34f850c0
|
||||||
$ md5sum install.sh | grep 029a9ac06e8b5bc6052eac57b2c3c9ca
|
$ md5sum install.sh | grep ae3d7aac5e15cf3dfc87046cfc5918d2
|
||||||
029a9ac0 6e8b5bc6 052eac57 b2c3c9ca
|
ae3d7aac 5e15cf3d fc87046c fc5918d2
|
||||||
$ sha512sum install.sh | grep f517006d9897747bed8a4694b1acba1b
|
$ sha512sum install.sh | grep dfc00d823137271a6d96225cea9e89f533ff6c81f
|
||||||
40f53af6 9e20dae5 713ba06c f517006d 9897747b ed8a4694 b1acba1b 1464beb4
|
9c5198d5 31a3b755 b7910ece 3a42d206 c804694d fc00d823 137271a6 d96225ce
|
||||||
60055629 3f2356f3 3e9c4e3c 76e3f3af a9db4b32 bd33322b 975696fc e6b23cfb
|
a9e89f53 3ff6c81f f52b298b ef9fb613 2d3f9ccd 0e2c7bd3 c35978b5 79acb5ca
|
||||||
$ bash install.sh
|
$ bash install.sh
|
||||||
|
|
||||||
Watch the intro video on http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
|
Watch the intro video on http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
|
||||||
|
|
|
@ -385,7 +385,7 @@ _parset_main() {
|
||||||
return 255
|
return 255
|
||||||
fi
|
fi
|
||||||
if [ "$_parset_NAME" = "--version" ] ; then
|
if [ "$_parset_NAME" = "--version" ] ; then
|
||||||
echo "parset 20210322 (GNU parallel `parallel --minversion 1`)"
|
echo "parset 20210323 (GNU parallel `parallel --minversion 1`)"
|
||||||
echo "Copyright (C) 2007-2021 Ole Tange, http://ole.tange.dk and Free Software"
|
echo "Copyright (C) 2007-2021 Ole Tange, http://ole.tange.dk and Free Software"
|
||||||
echo "Foundation, Inc."
|
echo "Foundation, Inc."
|
||||||
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"
|
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"
|
||||||
|
|
|
@ -385,7 +385,7 @@ _parset_main() {
|
||||||
return 255
|
return 255
|
||||||
fi
|
fi
|
||||||
if [ "$_parset_NAME" = "--version" ] ; then
|
if [ "$_parset_NAME" = "--version" ] ; then
|
||||||
echo "parset 20210322 (GNU parallel `parallel --minversion 1`)"
|
echo "parset 20210323 (GNU parallel `parallel --minversion 1`)"
|
||||||
echo "Copyright (C) 2007-2021 Ole Tange, http://ole.tange.dk and Free Software"
|
echo "Copyright (C) 2007-2021 Ole Tange, http://ole.tange.dk and Free Software"
|
||||||
echo "Foundation, Inc."
|
echo "Foundation, Inc."
|
||||||
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"
|
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"
|
||||||
|
|
|
@ -368,7 +368,7 @@ _parset_main() {
|
||||||
return 255
|
return 255
|
||||||
fi
|
fi
|
||||||
if [ "$_parset_NAME" = "--version" ] ; then
|
if [ "$_parset_NAME" = "--version" ] ; then
|
||||||
echo "parset 20210322 (GNU parallel `parallel --minversion 1`)"
|
echo "parset 20210323 (GNU parallel `parallel --minversion 1`)"
|
||||||
echo "Copyright (C) 2007-2021 Ole Tange, http://ole.tange.dk and Free Software"
|
echo "Copyright (C) 2007-2021 Ole Tange, http://ole.tange.dk and Free Software"
|
||||||
echo "Foundation, Inc."
|
echo "Foundation, Inc."
|
||||||
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"
|
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"
|
||||||
|
|
|
@ -371,7 +371,7 @@ _parset_main() {
|
||||||
return 255
|
return 255
|
||||||
fi
|
fi
|
||||||
if [ "$_parset_NAME" = "--version" ] ; then
|
if [ "$_parset_NAME" = "--version" ] ; then
|
||||||
echo "parset 20210322 (GNU parallel `parallel --minversion 1`)"
|
echo "parset 20210323 (GNU parallel `parallel --minversion 1`)"
|
||||||
echo "Copyright (C) 2007-2021 Ole Tange, http://ole.tange.dk and Free Software"
|
echo "Copyright (C) 2007-2021 Ole Tange, http://ole.tange.dk and Free Software"
|
||||||
echo "Foundation, Inc."
|
echo "Foundation, Inc."
|
||||||
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"
|
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"
|
||||||
|
|
|
@ -385,7 +385,7 @@ _parset_main() {
|
||||||
return 255
|
return 255
|
||||||
fi
|
fi
|
||||||
if [ "$_parset_NAME" = "--version" ] ; then
|
if [ "$_parset_NAME" = "--version" ] ; then
|
||||||
echo "parset 20210322 (GNU parallel `parallel --minversion 1`)"
|
echo "parset 20210323 (GNU parallel `parallel --minversion 1`)"
|
||||||
echo "Copyright (C) 2007-2021 Ole Tange, http://ole.tange.dk and Free Software"
|
echo "Copyright (C) 2007-2021 Ole Tange, http://ole.tange.dk and Free Software"
|
||||||
echo "Foundation, Inc."
|
echo "Foundation, Inc."
|
||||||
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"
|
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"
|
||||||
|
|
|
@ -362,7 +362,7 @@ _parset_main() {
|
||||||
return 255
|
return 255
|
||||||
fi
|
fi
|
||||||
if [ "$_parset_NAME" = "--version" ] ; then
|
if [ "$_parset_NAME" = "--version" ] ; then
|
||||||
echo "parset 20210322 (GNU parallel `parallel --minversion 1`)"
|
echo "parset 20210323 (GNU parallel `parallel --minversion 1`)"
|
||||||
echo "Copyright (C) 2007-2021 Ole Tange, http://ole.tange.dk and Free Software"
|
echo "Copyright (C) 2007-2021 Ole Tange, http://ole.tange.dk and Free Software"
|
||||||
echo "Foundation, Inc."
|
echo "Foundation, Inc."
|
||||||
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"
|
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
use strict;
|
use strict;
|
||||||
use Getopt::Long;
|
use Getopt::Long;
|
||||||
$Global::progname="niceload";
|
$Global::progname="niceload";
|
||||||
$Global::version = 20210322;
|
$Global::version = 20210323;
|
||||||
Getopt::Long::Configure("bundling","require_order");
|
Getopt::Long::Configure("bundling","require_order");
|
||||||
get_options_from_array(\@ARGV) || die_usage();
|
get_options_from_array(\@ARGV) || die_usage();
|
||||||
if($opt::version) {
|
if($opt::version) {
|
||||||
|
|
50
src/parallel
50
src/parallel
|
@ -969,6 +969,7 @@ sub spreadstdin() {
|
||||||
my $header = find_header(\$buf,$in);
|
my $header = find_header(\$buf,$in);
|
||||||
my $anything_written;
|
my $anything_written;
|
||||||
my $eof;
|
my $eof;
|
||||||
|
my $garbage_read;
|
||||||
|
|
||||||
sub read_block() {
|
sub read_block() {
|
||||||
# Read a --blocksize from STDIN
|
# Read a --blocksize from STDIN
|
||||||
|
@ -1023,23 +1024,37 @@ sub spreadstdin() {
|
||||||
# Pass records of N regexps
|
# Pass records of N regexps
|
||||||
# -N => (start..*?end){n}
|
# -N => (start..*?end){n}
|
||||||
# -L -N => (start..*?end){n*l}
|
# -L -N => (start..*?end){n*l}
|
||||||
my $read_n_lines = -1+
|
if(not $garbage_read) {
|
||||||
|
$garbage_read = 1;
|
||||||
|
if($buf !~ /^$recstart/o) {
|
||||||
|
# Buf does not start with $recstart => There is garbage.
|
||||||
|
# Make a single record of the garbage
|
||||||
|
if($buf =~
|
||||||
|
/(?s)^(?-s)(
|
||||||
|
(?:(?:(?!$recend$recstart)(?s).(?-s))*?$recend)
|
||||||
|
)
|
||||||
|
# Followed by recstart
|
||||||
|
(?=$recstart)/mox and length $1 > 0) {
|
||||||
|
$anything_written +=
|
||||||
|
write_record_to_pipe($chunk_number++,\$header,\$buf,
|
||||||
|
$recstart,$recend,length $1);
|
||||||
|
shorten(\$buf,length $1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $n_records =
|
||||||
$Global::max_number_of_args * ($Global::max_lines || 1);
|
$Global::max_number_of_args * ($Global::max_lines || 1);
|
||||||
# (?!negative lookahead) is needed to avoid backtracking
|
# (?!negative lookahead) is needed to avoid backtracking
|
||||||
# See: https://unix.stackexchange.com/questions/439356/
|
# See: https://unix.stackexchange.com/questions/439356/
|
||||||
|
# (?s).(?-s) = (.|[\n]) but faster
|
||||||
while($buf =~
|
while($buf =~
|
||||||
/(
|
/(?s)^(?-s)(
|
||||||
# Either recstart or at least one char from start
|
# n more times recstart.*recend
|
||||||
^(?: $recstart | .)
|
(?:$recstart(?:(?!$recend$recstart)(?s)(.)(?-s))*?$recend){$n_records}
|
||||||
# followed something
|
|
||||||
(?:(?!$recend$recstart).)*?
|
|
||||||
# and then recend
|
|
||||||
$recend
|
|
||||||
# Then n-1 times recstart.*recend
|
|
||||||
(?:$recstart(?:(?!$recend$recstart).)*?$recend){$read_n_lines}
|
|
||||||
)
|
)
|
||||||
# Followed by recstart
|
# Followed by recstart
|
||||||
(?=$recstart)/osx) {
|
(?=$recstart)/mox and length $1 > 0) {
|
||||||
$anything_written +=
|
$anything_written +=
|
||||||
write_record_to_pipe($chunk_number++,\$header,\$buf,
|
write_record_to_pipe($chunk_number++,\$header,\$buf,
|
||||||
$recstart,$recend,length $1);
|
$recstart,$recend,length $1);
|
||||||
|
@ -1050,7 +1065,8 @@ sub spreadstdin() {
|
||||||
sub pass_regexp() {
|
sub pass_regexp() {
|
||||||
# Find the last recend-recstart in $buf
|
# Find the last recend-recstart in $buf
|
||||||
$eof and return;
|
$eof and return;
|
||||||
if($buf =~ /^(.*$recend)$recstart.*?$/os) {
|
# (?s).(?-s) = (.|[\n]) but faster
|
||||||
|
if($buf =~ /^((?s).(?-s)*$recend)$recstart(?s).(?-s)*?$/mox) {
|
||||||
$anything_written +=
|
$anything_written +=
|
||||||
write_record_to_pipe($chunk_number++,\$header,\$buf,
|
write_record_to_pipe($chunk_number++,\$header,\$buf,
|
||||||
$recstart,$recend,length $1);
|
$recstart,$recend,length $1);
|
||||||
|
@ -1230,13 +1246,13 @@ sub recstartrecend() {
|
||||||
$recend = $opt::recend;
|
$recend = $opt::recend;
|
||||||
if($opt::regexp and $recend eq '') {
|
if($opt::regexp and $recend eq '') {
|
||||||
# --regexp --recend ''
|
# --regexp --recend ''
|
||||||
$recend = '.';
|
$recend = '(?s).(?-s)';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if($opt::regexp) {
|
if($opt::regexp) {
|
||||||
# If $recstart/$recend contains '|'
|
# If $recstart/$recend contains '|'
|
||||||
# this should only apply to the regexp
|
# the | should only apply to the regexp
|
||||||
$recstart = "(?:".$recstart.")";
|
$recstart = "(?:".$recstart.")";
|
||||||
$recend = "(?:".$recend.")";
|
$recend = "(?:".$recend.")";
|
||||||
# Quote # and space
|
# Quote # and space
|
||||||
|
@ -2173,7 +2189,7 @@ sub check_invalid_option_combinations() {
|
||||||
|
|
||||||
sub init_globals() {
|
sub init_globals() {
|
||||||
# Defaults:
|
# Defaults:
|
||||||
$Global::version = 20210322;
|
$Global::version = 20210323;
|
||||||
$Global::progname = 'parallel';
|
$Global::progname = 'parallel';
|
||||||
$::name = "GNU Parallel";
|
$::name = "GNU Parallel";
|
||||||
$Global::infinity = 2**31;
|
$Global::infinity = 2**31;
|
||||||
|
@ -8675,11 +8691,11 @@ sub remove_rec_sep($) {
|
||||||
my ($block_ref,$recstart,$recend) = @_;
|
my ($block_ref,$recstart,$recend) = @_;
|
||||||
# Remove record separator
|
# Remove record separator
|
||||||
if($opt::regexp) {
|
if($opt::regexp) {
|
||||||
$$block_ref =~ s/$recend$recstart//gos;
|
$$block_ref =~ s/$recend$recstart//gom;
|
||||||
$$block_ref =~ s/^$recstart//os;
|
$$block_ref =~ s/^$recstart//os;
|
||||||
$$block_ref =~ s/$recend$//os;
|
$$block_ref =~ s/$recend$//os;
|
||||||
} else {
|
} else {
|
||||||
$$block_ref =~ s/\Q$recend$recstart\E//gos;
|
$$block_ref =~ s/\Q$recend$recstart\E//gom;
|
||||||
$$block_ref =~ s/^\Q$recstart\E//os;
|
$$block_ref =~ s/^\Q$recstart\E//os;
|
||||||
$$block_ref =~ s/\Q$recend\E$//os;
|
$$block_ref =~ s/\Q$recend\E$//os;
|
||||||
}
|
}
|
||||||
|
|
|
@ -303,7 +303,7 @@ directory (if any) and extension removed.
|
||||||
To understand positional replacement strings see B<{>I<n>B<}>.
|
To understand positional replacement strings see B<{>I<n>B<}>.
|
||||||
|
|
||||||
|
|
||||||
=item B<{=>I<perl expression>B<=}> (beta testing)
|
=item B<{=>I<perl expression>B<=}>
|
||||||
|
|
||||||
Replace with calculated I<perl expression>. B<$_> will contain the
|
Replace with calculated I<perl expression>. B<$_> will contain the
|
||||||
same as B<{}>. After evaluating I<perl expression> B<$_> will be used
|
same as B<{}>. After evaluating I<perl expression> B<$_> will be used
|
||||||
|
@ -873,7 +873,7 @@ Implies B<--pipe> unless B<--pipepart> is used.
|
||||||
See also: B<--cat>.
|
See also: B<--cat>.
|
||||||
|
|
||||||
|
|
||||||
=item B<--filter> I<filter> (beta testing)
|
=item B<--filter> I<filter>
|
||||||
|
|
||||||
Only run jobs where I<filter> is true. I<filter> can contain
|
Only run jobs where I<filter> is true. I<filter> can contain
|
||||||
replacement strings and Perl code. Example:
|
replacement strings and Perl code. Example:
|
||||||
|
@ -1373,9 +1373,9 @@ mix. Compare:
|
||||||
See also: B<--group> B<--ungroup>
|
See also: B<--group> B<--ungroup>
|
||||||
|
|
||||||
|
|
||||||
=item B<--xapply> (beta testing)
|
=item B<--xapply>
|
||||||
|
|
||||||
=item B<--link> (beta testing)
|
=item B<--link>
|
||||||
|
|
||||||
Link input sources. Read multiple input sources like B<xapply>. If
|
Link input sources. Read multiple input sources like B<xapply>. If
|
||||||
multiple input sources are given, one argument will be read from each
|
multiple input sources are given, one argument will be read from each
|
||||||
|
@ -2638,9 +2638,9 @@ Silent. The job to be run will not be printed. This is the default.
|
||||||
Can be reversed with B<-v>.
|
Can be reversed with B<-v>.
|
||||||
|
|
||||||
|
|
||||||
=item B<--template> I<file>=I<repl> (beta testing)
|
=item B<--template> I<file>=I<repl>
|
||||||
|
|
||||||
=item B<--tmpl> I<file>=I<repl> (beta testing)
|
=item B<--tmpl> I<file>=I<repl>
|
||||||
|
|
||||||
Copy I<file> to I<repl>. All replacement strings in the contents of
|
Copy I<file> to I<repl>. All replacement strings in the contents of
|
||||||
I<file> will be replaced. All replacement strings in the name I<repl>
|
I<file> will be replaced. All replacement strings in the name I<repl>
|
||||||
|
|
|
@ -121,7 +121,7 @@ GetOptions(
|
||||||
"help" => \$opt::dummy,
|
"help" => \$opt::dummy,
|
||||||
) || exit(255);
|
) || exit(255);
|
||||||
$Global::progname = ($0 =~ m:(^|/)([^/]+)$:)[1];
|
$Global::progname = ($0 =~ m:(^|/)([^/]+)$:)[1];
|
||||||
$Global::version = 20210322;
|
$Global::version = 20210323;
|
||||||
if($opt::version) { version(); exit 0; }
|
if($opt::version) { version(); exit 0; }
|
||||||
@Global::sortoptions =
|
@Global::sortoptions =
|
||||||
shell_quote(@ARGV_before[0..($#ARGV_before-$#ARGV-1)]);
|
shell_quote(@ARGV_before[0..($#ARGV_before-$#ARGV-1)]);
|
||||||
|
|
2
src/sql
2
src/sql
|
@ -600,7 +600,7 @@ $Global::Initfile && unlink $Global::Initfile;
|
||||||
exit ($err);
|
exit ($err);
|
||||||
|
|
||||||
sub parse_options {
|
sub parse_options {
|
||||||
$Global::version = 20210322;
|
$Global::version = 20210323;
|
||||||
$Global::progname = 'sql';
|
$Global::progname = 'sql';
|
||||||
|
|
||||||
# This must be done first as this may exec myself
|
# This must be done first as this may exec myself
|
||||||
|
|
|
@ -16,6 +16,18 @@ export -f stdsort
|
||||||
# Test amount of parallelization
|
# Test amount of parallelization
|
||||||
# parallel --shuf --jl /tmp/myjl -j1 'export JOBS={1};'bash tests-to-run/parallel-local-0.3s.sh ::: {1..16} ::: {1..5}
|
# parallel --shuf --jl /tmp/myjl -j1 'export JOBS={1};'bash tests-to-run/parallel-local-0.3s.sh ::: {1..16} ::: {1..5}
|
||||||
|
|
||||||
|
par_env_parallel_pipefail() {
|
||||||
|
cat <<'EOF' | bash
|
||||||
|
echo "### test env_parallel with pipefail + inherit_errexit"
|
||||||
|
. $(which env_parallel.bash)
|
||||||
|
env_parallel --session
|
||||||
|
set -Eeuo pipefail
|
||||||
|
shopt -s inherit_errexit
|
||||||
|
|
||||||
|
env_parallel echo ::: OK
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
par_crnl() {
|
par_crnl() {
|
||||||
echo '### Give a warning if input is DOS-ascii'
|
echo '### Give a warning if input is DOS-ascii'
|
||||||
printf "b\r\nc\r\nd\r\ne\r\nf\r\n" | stdout parallel -k echo {}a
|
printf "b\r\nc\r\nd\r\ne\r\nf\r\n" | stdout parallel -k echo {}a
|
||||||
|
|
|
@ -887,7 +887,7 @@ par_test_cpu_detection_lscpu() {
|
||||||
}
|
}
|
||||||
export -f test_one
|
export -f test_one
|
||||||
compgen -A function | grep ^cpu | sort | parallel -j0 -k test_one
|
compgen -A function | grep ^cpu | sort | parallel -j0 -k test_one
|
||||||
rm ~/.parallel/tmp/sshlogin/*/cpuspec
|
rm ~/.parallel/tmp/sshlogin/*/cpuspec 2>/dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
par_null_resume() {
|
par_null_resume() {
|
||||||
|
|
|
@ -8,6 +8,34 @@
|
||||||
# Each should be taking 3-10s and be possible to run in parallel
|
# Each should be taking 3-10s and be possible to run in parallel
|
||||||
# I.e.: No race conditions, no logins
|
# I.e.: No race conditions, no logins
|
||||||
|
|
||||||
|
par_pipe_regexp() {
|
||||||
|
echo '### --pipe --regexp'
|
||||||
|
gen() {
|
||||||
|
cat <<EOF
|
||||||
|
A2, Start, 5
|
||||||
|
A2, 00100, 5
|
||||||
|
A2, 00200, 6
|
||||||
|
A2, 00300, 6
|
||||||
|
A2, Start, 7
|
||||||
|
A2, 00100, 7
|
||||||
|
A2, Start, 7
|
||||||
|
A2, 00200, 8
|
||||||
|
EOF
|
||||||
|
true
|
||||||
|
}
|
||||||
|
p="parallel --pipe --regexp -k"
|
||||||
|
gen | $p --recstart 'A\d+, Start' -N1 'echo Record;cat'
|
||||||
|
gen | $p --recstart '[A-Z]\d+, Start' -N1 'echo Record;cat'
|
||||||
|
gen | $p --recstart '.*, Start' -N1 'echo Record;cat'
|
||||||
|
echo '### Prepend first record with garbage'
|
||||||
|
(echo Garbage; gen) |
|
||||||
|
$p --recstart 'A\d+, Start' -N1 'echo Record;cat'
|
||||||
|
(echo Garbage; gen) |
|
||||||
|
$p --recstart '[A-Z]\d+, Start' -N1 'echo Record;cat'
|
||||||
|
(echo Garbage; gen) |
|
||||||
|
$p --recstart '.*, Start' -N1 'echo Record;cat'
|
||||||
|
}
|
||||||
|
|
||||||
par_delay_halt_soon() {
|
par_delay_halt_soon() {
|
||||||
echo "bug #59893: --halt soon doesn't work with --delay"
|
echo "bug #59893: --halt soon doesn't work with --delay"
|
||||||
seq 0 10 |
|
seq 0 10 |
|
||||||
|
|
|
@ -173,6 +173,8 @@ par_empty_line a
|
||||||
par_empty_line b
|
par_empty_line b
|
||||||
par_empty_string_quote bug #37694: Empty string argument skipped when using --quote
|
par_empty_string_quote bug #37694: Empty string argument skipped when using --quote
|
||||||
par_empty_string_quote 3
|
par_empty_string_quote 3
|
||||||
|
par_env_parallel_pipefail ### test env_parallel with pipefail + inherit_errexit
|
||||||
|
par_env_parallel_pipefail OK
|
||||||
par_exit_val ### Test bug #45619: "--halt" erroneous error exit code (should give 0)
|
par_exit_val ### Test bug #45619: "--halt" erroneous error exit code (should give 0)
|
||||||
par_exit_val 0
|
par_exit_val 0
|
||||||
par_exit_val ### Test exit val - true
|
par_exit_val ### Test exit val - true
|
||||||
|
@ -898,7 +900,8 @@ par_sem_quote echo
|
||||||
par_sem_quote
|
par_sem_quote
|
||||||
par_slow_pipe_regexp ### bug #53718: --pipe --regexp -N blocks
|
par_slow_pipe_regexp ### bug #53718: --pipe --regexp -N blocks
|
||||||
par_slow_pipe_regexp This should take a few ms, but took more than 2 hours
|
par_slow_pipe_regexp This should take a few ms, but took more than 2 hours
|
||||||
par_slow_pipe_regexp 980 981 5881
|
par_slow_pipe_regexp 0 1 1
|
||||||
|
par_slow_pipe_regexp 980 981 5880
|
||||||
par_slow_pipe_regexp 25021 25021 150125
|
par_slow_pipe_regexp 25021 25021 150125
|
||||||
par_slow_pipe_regexp ### These should give same output
|
par_slow_pipe_regexp ### These should give same output
|
||||||
par_slow_pipe_regexp 6e72d7f86f6a423b9a7fa97630587815 -
|
par_slow_pipe_regexp 6e72d7f86f6a423b9a7fa97630587815 -
|
||||||
|
|
|
@ -208,6 +208,80 @@ par_multiline_commands echo finish 4
|
||||||
par_multiline_commands parallel: Warning: Command lines contain newline. Forcing --null.
|
par_multiline_commands parallel: Warning: Command lines contain newline. Forcing --null.
|
||||||
par_multiline_commands 4
|
par_multiline_commands 4
|
||||||
par_multiline_commands finish 4
|
par_multiline_commands finish 4
|
||||||
|
par_pipe_regexp ### --pipe --regexp
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 5
|
||||||
|
par_pipe_regexp A2, 00100, 5
|
||||||
|
par_pipe_regexp A2, 00200, 6
|
||||||
|
par_pipe_regexp A2, 00300, 6
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 7
|
||||||
|
par_pipe_regexp A2, 00100, 7
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 7
|
||||||
|
par_pipe_regexp A2, 00200, 8
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 5
|
||||||
|
par_pipe_regexp A2, 00100, 5
|
||||||
|
par_pipe_regexp A2, 00200, 6
|
||||||
|
par_pipe_regexp A2, 00300, 6
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 7
|
||||||
|
par_pipe_regexp A2, 00100, 7
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 7
|
||||||
|
par_pipe_regexp A2, 00200, 8
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 5
|
||||||
|
par_pipe_regexp A2, 00100, 5
|
||||||
|
par_pipe_regexp A2, 00200, 6
|
||||||
|
par_pipe_regexp A2, 00300, 6
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 7
|
||||||
|
par_pipe_regexp A2, 00100, 7
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 7
|
||||||
|
par_pipe_regexp A2, 00200, 8
|
||||||
|
par_pipe_regexp ### Prepend first record with garbage
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp Garbage
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 5
|
||||||
|
par_pipe_regexp A2, 00100, 5
|
||||||
|
par_pipe_regexp A2, 00200, 6
|
||||||
|
par_pipe_regexp A2, 00300, 6
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 7
|
||||||
|
par_pipe_regexp A2, 00100, 7
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 7
|
||||||
|
par_pipe_regexp A2, 00200, 8
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp Garbage
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 5
|
||||||
|
par_pipe_regexp A2, 00100, 5
|
||||||
|
par_pipe_regexp A2, 00200, 6
|
||||||
|
par_pipe_regexp A2, 00300, 6
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 7
|
||||||
|
par_pipe_regexp A2, 00100, 7
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 7
|
||||||
|
par_pipe_regexp A2, 00200, 8
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp Garbage
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 5
|
||||||
|
par_pipe_regexp A2, 00100, 5
|
||||||
|
par_pipe_regexp A2, 00200, 6
|
||||||
|
par_pipe_regexp A2, 00300, 6
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 7
|
||||||
|
par_pipe_regexp A2, 00100, 7
|
||||||
|
par_pipe_regexp Record
|
||||||
|
par_pipe_regexp A2, Start, 7
|
||||||
|
par_pipe_regexp A2, 00200, 8
|
||||||
par_progress ### Test of --progress
|
par_progress ### Test of --progress
|
||||||
par_progress 16
|
par_progress 16
|
||||||
par_progress ### Test of --progress with no jobs
|
par_progress ### Test of --progress with no jobs
|
||||||
|
|
Loading…
Reference in a new issue