parallel: --compress now works with --files and --results.

This commit is contained in:
Ole Tange 2013-11-03 04:22:48 +01:00
parent 56be1f38c3
commit 2852939aa5

View file

@ -798,7 +798,7 @@ sub get_options_from_array {
sub parse_options {
# Returns: N/A
# Defaults:
$Global::version = 20131022;
$Global::version = 20131102;
$Global::progname = 'parallel';
$Global::infinity = 2**31;
$Global::debug = 0;
@ -2811,12 +2811,13 @@ sub loadavg {
# If the currently know loadavg is too old:
# Recompute a new one in the background
# Returns:
# last load average computed
# $last_loadavg = last load average computed (undef if none)
my $self = shift;
# Should we update the loadavg file?
my $update_loadavg_file = 0;
if(-r $self->{'loadavg_file'}) {
open(my $load_fh, "<", $self->{'loadavg_file'}) || ::die_bug("loadavg_file-r");
open(my $load_fh, "<", $self->{'loadavg_file'}) ||
::die_bug("loadavg_file-r: ".$self->{'loadavg_file'});
local $/ = undef;
my $load_out = <$load_fh>;
close $load_fh;
@ -3919,7 +3920,7 @@ sub openoutputfiles {
# Open files for STDOUT and STDERR
# Set file handles in $self->fd and possibly $self->fd_input
my $self = shift;
my ($outfh, $errfh, $outname, $errname);
my ($outfh, $errfh, $outname, $errname, $unlink_out, $unlink_err);
if($opt::results) {
my $args_as_dirname = $self->{'commandline'}->args_as_dirname();
# prefix/name1/val1/name2/val2/
@ -3940,29 +3941,18 @@ sub openoutputfiles {
} elsif($Global::grouped) {
# To group we create temporary files for STDOUT and STDERR
# To avoid the cleanup unlink the files immediately (but keep them open)
if($opt::compress) {
my($i_outfh,$i_errfh);
($i_outfh, $outname) = ::tempfile(SUFFIX => ".par");
($i_errfh, $errname) = ::tempfile(SUFFIX => ".par");
$self->set_fd_input(1, $i_outfh);
$self->set_fd_input(2, $i_errfh);
my $rm = $Global::debug ? "true" : "rm";
::debug("| ($rm $outname; $opt::compress_program) > $outname\n");
open($outfh,"|-","($rm $outname; $opt::compress_program) > $outname") || die $?;
::debug("| ($rm $errname; $opt::compress_program) > $errname\n");
open($errfh,"|-","($rm $errname; $opt::compress_program) > $errname") || die $?;
} elsif(@Global::tee_jobs) {
if(@Global::tee_jobs) {
# files must be removed when the tee is done
} elsif($opt::files) {
($outfh, $outname) = ::tempfile(SUFFIX => ".par");
($errfh, $errname) = ::tempfile(SUFFIX => ".par");
# --files => only remove stderr
unlink $errname;
$unlink_err = 1;
} else {
($outfh, $outname) = ::tempfile(SUFFIX => ".par");
($errfh, $errname) = ::tempfile(SUFFIX => ".par");
unlink $outname;
unlink $errname;
$unlink_out = 1;
$unlink_err = 1;
}
} else {
# --ungroup
@ -3971,11 +3961,28 @@ sub openoutputfiles {
# File name must be empty as it will otherwise be printed
$outname = "";
$errname = "";
$unlink_out = 1;
$unlink_err = 1;
}
$self->set_fd_file_name(1,$outname);
$self->set_fd_file_name(2,$errname);
$self->set_fd(1,$outfh);
$self->set_fd(2,$errfh);
if($opt::compress) {
$self->set_fd_input(1, $outfh);
$self->set_fd_input(2, $errfh);
my $rm = $unlink_out ? "rm" : "true";
::debug("| ($rm $outname; $opt::compress_program) > $outname\n");
open(my $coutfh,"|-","($rm $outname; $opt::compress_program) > $outname") || die $?;
$rm = $unlink_err ? "rm" : "true";
::debug("| ($rm $errname; $opt::compress_program) > $errname\n");
open(my $cerrfh,"|-","($rm $errname; $opt::compress_program) > $errname") || die $?;
$self->set_fd(1,$coutfh);
$self->set_fd(2,$cerrfh);
} else {
$self->set_fd(1,$outfh);
$self->set_fd(2,$errfh);
$unlink_out && unlink($outname);
$unlink_err && unlink($errname);
}
}
sub set_fd {
@ -4754,6 +4761,8 @@ sub print {
}
::debug("File descriptor $fdno:");
if($opt::files) {
# If --compress: $in_fd must be closed first.
close($in_fd);
if($fdno == 1 and $self->fd_file_name($fdno)) {
print $out_fd $self->fd_file_name($fdno),"\n";
}