]> git.madduck.net Git - code/myrepos.git/blobdiff - mr

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

fix uninitialized value
[code/myrepos.git] / mr
diff --git a/mr b/mr
index 9bcc1ea8c03d66c0c5302af5b2b779ba338dcdb9..98e080c2f4f932cb6f52879a8d4be060c52bba99 100755 (executable)
--- 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;
@@ -578,7 +586,7 @@ my $no_chdir=0;
 my $jobs=1;
 my $trust_all=0;
 my $directory=getcwd();
-my $terminal=-t STDOUT && eval{require IO::Pty::Easy;IO::Pty::Easy->import();1;} eq 1;
+my $terminal=-t STDOUT && eval{require IO::Pty::Easy;IO::Pty::Easy->import();1;};
 
 my $HOME_MR_CONFIG = "$ENV{HOME}/.mrconfig";
 $ENV{MR_CONFIG}=find_mrconfig();
@@ -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,