From ffb40f2f354954634cdd554071e60ef3650b3010 Mon Sep 17 00:00:00 2001 From: Paul Wise Date: Sun, 9 Jun 2013 15:36:37 +0800 Subject: [PATCH] Add a minimal output mode that shows output when appropriate. Closes: #694031 --- mr | 47 +++++++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/mr b/mr index 9bcc1ea..87acef3 100755 --- a/mr +++ b/mr @@ -265,6 +265,13 @@ configuration. Be verbose. +=item -m + +=item --minimal + +Minimise output. If a command fails or there is any output then the usual +output will be shown. + =item -q =item --quiet @@ -568,6 +575,7 @@ use constant { # configurables my $config_overridden=0; my $verbose=0; +my $minimal=0; my $quiet=0; my $stats=0; my $force=0; @@ -726,6 +734,7 @@ sub terminal_friendly_spawn { my $actionmsg = shift; my $sh = shift; my $quiet = shift; + my $minimal = shift; my $output = ""; if ($terminal) { my $pty = IO::Pty::Easy->new; @@ -742,11 +751,11 @@ sub terminal_friendly_spawn { if ($quiet && $ret != 0) { print "$actionmsg\n" if $actionmsg; print STDERR $output; - } elsif (!$quiet) { + } elsif (!$quiet && (!$minimal || $output)) { print "$actionmsg\n" if $actionmsg; print $output; } - return $ret; + return ($ret, $output ? 1 : 0); } sub action { @@ -828,7 +837,7 @@ sub action { return FAILED; } else { - print STDERR "mr $action: no defined action for $vcs repository $fulldir, skipping\n"; + print STDERR "mr $action: no defined action for $vcs repository $fulldir, skipping\n" unless $minimal; return SKIPPED; } } @@ -842,16 +851,16 @@ sub action { $s=~s/^\Q$fulldir\E\/?//; $actionmsg="mr $action: $fulldir (in subdir $s)"; } - print "$actionmsg\n" unless $quiet; + print "$actionmsg\n" unless $quiet || $minimal; my $hookret=hook("pre_$action", $topdir, $subdir); return $hookret if $hookret != OK; - my $ret=runsh $action, $topdir, $subdir, + my ($ret, $out)=runsh $action, $topdir, $subdir, $command, \@ARGV, sub { my $sh=shift; - if (!$jobs || $jobs > 1 || $quiet) { - return terminal_friendly_spawn($actionmsg, $sh, $quiet); + if (!$jobs || $jobs > 1 || $quiet || $minimal) { + return terminal_friendly_spawn($actionmsg, $sh, $quiet, $minimal); } else { system($sh); @@ -889,7 +898,7 @@ sub action { return FAILED; } - my $ret=hook("post_$action", $topdir, $subdir); + my ($ret, $hook_out)=hook("post_$action", $topdir, $subdir); return $ret if $ret != OK; if ($is_checkout || $is_update) { @@ -903,7 +912,7 @@ sub action { return $ret if $ret != OK; } - return OK; + return (OK, $out || $hook_out); } } } @@ -913,10 +922,10 @@ sub hook { my $command=$config{$topdir}{$subdir}{$hook}; return OK unless defined $command; - my $ret=runsh $hook, $topdir, $subdir, $command, [], sub { + my ($ret,$out)=runsh $hook, $topdir, $subdir, $command, [], sub { my $sh=shift; - if (!$jobs || $jobs > 1 || $quiet) { - return terminal_friendly_spawn(undef, $sh, $quiet); + if (!$jobs || $jobs > 1 || $quiet || $minimal) { + return terminal_friendly_spawn(undef, $sh, $quiet, $minimal); } else { system($sh); @@ -936,7 +945,7 @@ sub hook { } } - return OK; + return (OK, $out); } # run actions on multiple repos, in parallel @@ -964,7 +973,7 @@ sub mrs { close CHILD_STDERR; close $outfh; close $errfh; - exit action($action, @$repo); + exit +(action($action, @$repo))[0]; } close CHILD_STDOUT; close CHILD_STDERR; @@ -995,7 +1004,7 @@ sub mrs { waitpid($active[$i][0], 0); print STDOUT $out[$i][0]; print STDERR $out[$i][1]; - record($active[$i][1], $? >> 8); + record($active[$i][1], $? >> 8, $out[$i][0] || $out[$i][1]); splice(@fhs, $i, 1); splice(@active, $i, 1); splice(@out, $i, 1); @@ -1012,10 +1021,11 @@ sub mrs { sub record { my $dir=shift()->[0]; my $ret=shift; + my $out=shift; if ($ret == OK) { push @ok, $dir; - print "\n" unless $quiet; + print "\n" unless $quiet || ($minimal && !$out); } elsif ($ret == FAILED) { if ($interactive) { @@ -1046,10 +1056,10 @@ sub showstats { showstat($#ok+1, "ok", "ok"), showstat($#failed+1, "failed", "failed"), showstat($#skipped+1, "skipped", "skipped"), - ).")\n" unless $quiet; + ).")\n" unless $quiet || $minimal; if ($stats) { if (@skipped) { - print "mr $action: (skipped: ".join(" ", @skipped).")\n" unless $quiet; + print "mr $action: (skipped: ".join(" ", @skipped).")\n" unless $quiet || $minimal; } if (@failed) { print STDERR "mr $action: (failed: ".join(" ", @failed).")\n"; @@ -1841,6 +1851,7 @@ sub getopts { "p|path" => sub { }, # now default, ignore "f|force" => \$force, "v|verbose" => \$verbose, + "m|minimal" => \$minimal, "q|quiet" => \$quiet, "s|stats" => \$stats, "k|insecure" => \$insecure, -- 2.39.2