]> 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:

Always ensure all parent .mrconfig files are loaded
[code/myrepos.git] / mr
diff --git a/mr b/mr
index 9bcc1ea8c03d66c0c5302af5b2b779ba338dcdb9..3c5321fc3fcf0393d4cd6ec7ecc4b48e39009411 100755 (executable)
--- a/mr
+++ b/mr
@@ -265,6 +265,13 @@ configuration.
 
 Be verbose.
 
 
 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
 =item -q
 
 =item --quiet
@@ -556,6 +563,7 @@ use warnings;
 use strict;
 use Getopt::Long;
 use Cwd qw(getcwd abs_path);
 use strict;
 use Getopt::Long;
 use Cwd qw(getcwd abs_path);
+use File::Basename;
 
 # things that can happen when mr runs a command
 use constant {
 
 # things that can happen when mr runs a command
 use constant {
@@ -568,6 +576,7 @@ use constant {
 # configurables
 my $config_overridden=0;
 my $verbose=0;
 # configurables
 my $config_overridden=0;
 my $verbose=0;
+my $minimal=0;
 my $quiet=0;
 my $stats=0;
 my $force=0;
 my $quiet=0;
 my $stats=0;
 my $force=0;
@@ -578,7 +587,7 @@ my $no_chdir=0;
 my $jobs=1;
 my $trust_all=0;
 my $directory=getcwd();
 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();
 
 my $HOME_MR_CONFIG = "$ENV{HOME}/.mrconfig";
 $ENV{MR_CONFIG}=find_mrconfig();
@@ -726,6 +735,7 @@ sub terminal_friendly_spawn {
        my $actionmsg = shift;
        my $sh = shift;
        my $quiet = shift;
        my $actionmsg = shift;
        my $sh = shift;
        my $quiet = shift;
+       my $minimal = shift;
        my $output = "";
        if ($terminal) {
                my $pty = IO::Pty::Easy->new;
        my $output = "";
        if ($terminal) {
                my $pty = IO::Pty::Easy->new;
@@ -742,11 +752,11 @@ sub terminal_friendly_spawn {
        if ($quiet && $ret != 0) {
                print "$actionmsg\n" if $actionmsg;
                print STDERR $output;
        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;
        }
                print "$actionmsg\n" if $actionmsg;
                print $output;
        }
-       return $ret;
+       return ($ret, $output ? 1 : 0);
 }
 
 sub action {
 }
 
 sub action {
@@ -828,7 +838,7 @@ sub action {
                        return FAILED;
                }
                else {
                        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;
                }
        }
                        return SKIPPED;
                }
        }
@@ -842,16 +852,16 @@ sub action {
                        $s=~s/^\Q$fulldir\E\/?//;
                        $actionmsg="mr $action: $fulldir (in subdir $s)";
                }
                        $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);
+               my ($hookret, $hook_out)=hook("pre_$action", $topdir, $subdir);
                return $hookret if $hookret != OK;
 
                return $hookret if $hookret != OK;
 
-               my $ret=runsh $action, $topdir, $subdir,
+               my ($ret, $out)=runsh $action, $topdir, $subdir,
                        $command, \@ARGV, sub {
                                my $sh=shift;
                        $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);
                                }
                                else {
                                        system($sh);
@@ -889,7 +899,7 @@ sub action {
                                return FAILED;
                        }
 
                                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) {
                        return $ret if $ret != OK;
                        
                        if ($is_checkout || $is_update) {
@@ -899,11 +909,11 @@ sub action {
                                                return FAILED;
                                        }
                                }
                                                return FAILED;
                                        }
                                }
-                               my $ret=hook("fixups", $topdir, $subdir);
+                               my ($ret, $hook_out)=hook("fixups", $topdir, $subdir);
                                return $ret if $ret != OK;
                        }
                        
                                return $ret if $ret != OK;
                        }
                        
-                       return OK;
+                       return (OK, $out || $hook_out);
                }
        }
 }
                }
        }
 }
@@ -913,10 +923,10 @@ sub hook {
 
        my $command=$config{$topdir}{$subdir}{$hook};
        return OK unless defined $command;
 
        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;
                        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);
                        }
                        else {
                                system($sh);
@@ -936,7 +946,7 @@ sub hook {
                }
        }
 
                }
        }
 
-       return OK;
+       return (OK, $out);
 }
 
 # run actions on multiple repos, in parallel
 }
 
 # run actions on multiple repos, in parallel
@@ -964,7 +974,7 @@ sub mrs {
                                close CHILD_STDERR;
                                close $outfh;
                                close $errfh;
                                close CHILD_STDERR;
                                close $outfh;
                                close $errfh;
-                               exit action($action, @$repo);
+                               exit +(action($action, @$repo))[0];
                        }
                        close CHILD_STDOUT;
                        close CHILD_STDERR;
                        }
                        close CHILD_STDOUT;
                        close CHILD_STDERR;
@@ -995,7 +1005,7 @@ sub mrs {
                                                        waitpid($active[$i][0], 0);
                                                        print STDOUT $out[$i][0];
                                                        print STDERR $out[$i][1];
                                                        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);
                                                        splice(@fhs, $i, 1);
                                                        splice(@active, $i, 1);
                                                        splice(@out, $i, 1);
@@ -1012,10 +1022,11 @@ sub mrs {
 sub record {
        my $dir=shift()->[0];
        my $ret=shift;
 sub record {
        my $dir=shift()->[0];
        my $ret=shift;
+       my $out=shift;
 
        if ($ret == OK) {
                push @ok, $dir;
 
        if ($ret == OK) {
                push @ok, $dir;
-               print "\n" unless $quiet;
+               print "\n" unless $quiet || ($minimal && !$out);
        }
        elsif ($ret == FAILED) {
                if ($interactive) {
        }
        elsif ($ret == FAILED) {
                if ($interactive) {
@@ -1046,10 +1057,10 @@ sub showstats {
                showstat($#ok+1, "ok", "ok"),
                showstat($#failed+1, "failed", "failed"),
                showstat($#skipped+1, "skipped", "skipped"),
                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) {
        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";
                }
                if (@failed) {
                        print STDERR "mr $action: (failed: ".join(" ", @failed).")\n";
@@ -1268,6 +1279,7 @@ sub loadconfig {
        my @toload;
 
        my $in;
        my @toload;
 
        my $in;
+       my $absf=abs_path($f);
        my $trusted;
        if (ref $f eq 'GLOB') {
                $dir="";
        my $trusted;
        if (ref $f eq 'GLOB') {
                $dir="";
@@ -1275,7 +1287,6 @@ sub loadconfig {
                $trusted=1;
        }
        else {
                $trusted=1;
        }
        else {
-               my $absf=abs_path($f);
                if ($loaded{$absf}) {
                        return;
                }
                if ($loaded{$absf}) {
                        return;
                }
@@ -1291,7 +1302,11 @@ sub loadconfig {
                }
 
                $dir=abs_path($dir)."/";
                }
 
                $dir=abs_path($dir)."/";
-               
+
+               if (chdir($dir)) {
+                       $f=basename($f);
+               }
+
                if (! exists $configfiles{$dir}) {
                        $configfiles{$dir}=$f;
                }
                if (! exists $configfiles{$dir}) {
                        $configfiles{$dir}=$f;
                }
@@ -1302,6 +1317,7 @@ sub loadconfig {
                        if ($parent eq '/') {
                                $parent="";
                        }
                        if ($parent eq '/') {
                                $parent="";
                        }
+                       loadconfig($parent);
                        if (exists $config{$parent} &&
                            exists $config{$parent}{DEFAULT}) {
                                $config{$dir}{DEFAULT}={ %{$config{$parent}{DEFAULT}} };
                        if (exists $config{$parent} &&
                            exists $config{$parent}{DEFAULT}) {
                                $config{$dir}{DEFAULT}={ %{$config{$parent}{DEFAULT}} };
@@ -1313,7 +1329,12 @@ sub loadconfig {
                        return;
                }
 
                        return;
                }
 
-               print "mr: loading config $f\n" if $verbose;
+               if ($f =~ /\//) {
+                       print "mr: loading config $f\n" if $verbose;
+               } else {
+                       print "mr: loading config $f (from ".getcwd().")\n" if $verbose;
+               }
+
                open($in, "<", $f) || die "mr: open $f: $!\n";
        }
        my @lines=<$in>;
                open($in, "<", $f) || die "mr: open $f: $!\n";
        }
        my @lines=<$in>;
@@ -1357,7 +1378,7 @@ sub loadconfig {
                                "this can allow arbitrary code execution!)\n";
                }
                else {
                                "this can allow arbitrary code execution!)\n";
                }
                else {
-                       die "mr: $msg in untrusted $f line $lineno\n".
+                       die "mr: $msg in untrusted $absf line $lineno\n".
                                "(To trust this file, list it in ~/.mrtrust.)\n";
                }
        };
                                "(To trust this file, list it in ~/.mrtrust.)\n";
                }
        };
@@ -1841,6 +1862,7 @@ sub getopts {
                "p|path" => sub { }, # now default, ignore
                "f|force" => \$force,
                "v|verbose" => \$verbose,
                "p|path" => sub { }, # now default, ignore
                "f|force" => \$force,
                "v|verbose" => \$verbose,
+               "m|minimal" => \$minimal,
                "q|quiet" => \$quiet,
                "s|stats" => \$stats,
                "k|insecure" => \$insecure,
                "q|quiet" => \$quiet,
                "s|stats" => \$stats,
                "k|insecure" => \$insecure,
@@ -2076,6 +2098,7 @@ svn_grep = ack-grep "$@"
 git_svn_grep = git grep "$@"
 git_grep = git grep "$@"
 bzr_grep = ack-grep "$@"
 git_svn_grep = git grep "$@"
 git_grep = git grep "$@"
 bzr_grep = ack-grep "$@"
+darcs_grep = ack-grep "$@"
 
 run = "$@"
 
 
 run = "$@"