From 6f3da78d6ca53822ce3d797d4328aceda7582050 Mon Sep 17 00:00:00 2001 From: Ole Tange Date: Sun, 18 Dec 2011 21:49:37 +0100 Subject: [PATCH] bug #35069: --pipe without command should give reasonable error message. --- src/parallel | 31 +++++++++++++++++++------------ testsuite/tests-to-run/test30.sh | 3 +++ testsuite/wanted-results/test30 | 2 ++ testsuite/wanted-results/test33 | 1 + 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/parallel b/src/parallel index ffc4bac8..6af272e5 100755 --- a/src/parallel +++ b/src/parallel @@ -131,7 +131,6 @@ for my $sshlogin (values %Global::host) { $sshlogin->max_jobs_running(); } - init_run_jobs(); my $sem; if($Global::semaphore) { @@ -2318,7 +2317,7 @@ sub processes_available_by_system_limit { $Global::JobQueue->empty() and last; ($job) = $Global::JobQueue->get(); push(@jobs, $job); - } + } } $wait_time_for_getting_args += time - $before_getting_arg; $system_limit++; @@ -3292,7 +3291,7 @@ sub sshreturn { $file =~ s:^\./::g; # Remove ./ if any my $relpath = ($file !~ m:^/:); # Is the path relative? # Use different subdirs depending on abs or rel path - + # Return or cleanup my @cmd = (); my $rsync_destdir = ($relpath ? "./" : "/"); @@ -3735,7 +3734,7 @@ sub populate { ::wait_and_exit(255); } } - + if(defined $self->{'max_number_of_args'}) { if($self->number_of_args() >= $self->{'max_number_of_args'}) { last; @@ -4221,16 +4220,24 @@ sub get { ); $cmd_line->populate(); ::debug("cmd_line->number_of_args ".$cmd_line->number_of_args()."\n"); - if(not $::opt_pipe and $cmd_line->number_of_args() == 0) { - # We did not get more args - maybe at EOF string? - return undef; - } elsif($cmd_line->replaced() eq "") { - # Empty command - get the next instead - return $self->get(); + if($::opt_pipe) { + if($cmd_line->replaced() eq "") { + # Empty command - pipe requires a command + print STDERR "$Global::progname: --pipe must have a ". + "command to pipe into (e.g. 'cat')\n"; + ::wait_and_exit(255); + } } else { - $self->set_seq($self->seq()+1); - return $cmd_line; + if($cmd_line->number_of_args() == 0) { + # We did not get more args - maybe at EOF string? + return undef; + } elsif($cmd_line->replaced() eq "") { + # Empty command - get the next instead + return $self->get(); + } } + $self->set_seq($self->seq()+1); + return $cmd_line; } } diff --git a/testsuite/tests-to-run/test30.sh b/testsuite/tests-to-run/test30.sh index 7f255260..e9bcc6b0 100644 --- a/testsuite/tests-to-run/test30.sh +++ b/testsuite/tests-to-run/test30.sh @@ -19,4 +19,7 @@ seq 2 | stdout parallel -X --eta echo echo '### --timeout on remote machines' parallel -j0 --timeout 3 --onall -S .. 'sleep {}; echo {}' ::: 1 6 7 ; echo $? + +echo '### --pipe without command' +seq -w 10 | stdout parallel --pipe EOF diff --git a/testsuite/wanted-results/test30 b/testsuite/wanted-results/test30 index 71c8c357..639d5db7 100644 --- a/testsuite/wanted-results/test30 +++ b/testsuite/wanted-results/test30 @@ -22,3 +22,5 @@ Computers / CPU cores / Max jobs to run 1 1 2 +### --pipe without command +parallel: --pipe must have a command to pipe into (e.g. 'cat') diff --git a/testsuite/wanted-results/test33 b/testsuite/wanted-results/test33 index af88ba54..e8643808 100644 --- a/testsuite/wanted-results/test33 +++ b/testsuite/wanted-results/test33 @@ -12,6 +12,7 @@ cat ... | parallel --pipe [options] [command [arguments]] {3} {3.} {3/} {3/.} Positional replacement strings -S sshlogin Example: foo@server.example.com +--slf .. Use ~/.parallel/sshloginfile as the list of sshlogins --trc {}.bar Shorthand for --transfer --return {}.bar --cleanup --onall Run the given command with argument on all sshlogins --nonall Run the given command with no arguments on all sshlogins