]>
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:
+=item -m
+
+=item --minimal
+
+Minimise output. If a command fails or there is any output then the usual
+output will be shown.
+
use strict;
use Getopt::Long;
use Cwd qw(getcwd abs_path);
use strict;
use Getopt::Long;
use Cwd qw(getcwd abs_path);
# things that can happen when mr runs a command
use constant {
# things that can happen when mr runs a command
use constant {
# configurables
my $config_overridden=0;
my $verbose=0;
# configurables
my $config_overridden=0;
my $verbose=0;
my $quiet=0;
my $stats=0;
my $force=0;
my $quiet=0;
my $stats=0;
my $force=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();
my $actionmsg = shift;
my $sh = shift;
my $quiet = shift;
my $actionmsg = shift;
my $sh = shift;
my $quiet = shift;
my $output = "";
if ($terminal) {
my $pty = IO::Pty::Easy->new;
my $output = "";
if ($terminal) {
my $pty = IO::Pty::Easy->new;
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 && (!$minimal || $output) ) {
print "$actionmsg\n" if $actionmsg;
print $output;
}
print "$actionmsg\n" if $actionmsg;
print $output;
}
+ return ($ret, $output ? 1 : 0) ;
- 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 ;
$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 );
- 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) {
- 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, $out || $hook_out) ;
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 {
- 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 );
}
# run actions on multiple repos, in parallel
}
# run actions on multiple repos, in parallel
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;
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);
sub record {
my $dir=shift()->[0];
my $ret=shift;
sub record {
my $dir=shift()->[0];
my $ret=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) {
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 || $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";
my $trusted;
if (ref $f eq 'GLOB') {
$dir="";
my $trusted;
if (ref $f eq 'GLOB') {
$dir="";
if ($loaded{$absf}) {
return;
}
if ($loaded{$absf}) {
return;
}
}
$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;
}
if ($parent eq '/') {
$parent="";
}
if ($parent eq '/') {
$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}} };
- 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>;
"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 $abs f line $lineno\n".
"(To trust this file, list it in ~/.mrtrust.)\n";
}
};
"(To trust this file, list it in ~/.mrtrust.)\n";
}
};
"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,
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 "$@"