X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/c4cd5eba9e41a024e9eb8fc2f62cf4f37723b97e..3d2a8945576fea043684b12847ed647171111874:/mr diff --git a/mr b/mr index d170e67..44fb671 100755 --- a/mr +++ b/mr @@ -146,6 +146,11 @@ Be verbose. Expand the statistics line displayed at the end to include information about exactly which repositories failed and were skipped, if any. +=item -n + +Just operate on the repository for the current directory, do not +recurse into deeper repositories. + =back =head1 FILES @@ -250,10 +255,16 @@ use strict; use Getopt::Long; use Cwd qw(getcwd abs_path); +$SIG{INT}=sub { + print STDERR "mr: interrupted\n"; + exit 2; +}; + $ENV{MR_CONFIG}="$ENV{HOME}/.mrconfig"; my $directory=getcwd(); my $verbose=0; my $stats=0; +my $no_recurse=0; my %config; my %knownactions; my %alias; @@ -261,9 +272,10 @@ my %alias; Getopt::Long::Configure("no_permute"); my $result=GetOptions( "d|directory=s" => sub { $directory=abs_path($_[1]) }, - "c|config=s" => \$ENV{MR_CONFIG}, + "c|config=s" => sub { $ENV{MR_CONFIG}=abs_path($_[1]) }, "v|verbose" => \$verbose, "s|stats" => \$stats, + "n|no-recurse" => \$no_recurse, ); if (! $result || @ARGV < 1) { die("Usage: mr [-d directory] action [params ...]\n". @@ -311,7 +323,7 @@ elsif ($action eq 'config') { } my $section=shift; if ($section=~/^\//) { - # try to convert to a path relative to $config's dir + # try to convert to a path relative to the config file my ($dir)=$ENV{MR_CONFIG}=~/^(.*\/)[^\/]+$/; if ($section=~/^\Q$dir\E(.*)/) { $section=$1; @@ -357,7 +369,8 @@ foreach my $topdir (sort keys %config) { my $d=$directory; $dir.="/" unless $dir=~/\/$/; $d.="/" unless $d=~/\/$/; - next if $dir ne $directory && $dir !~ /^\Q$directory\E/; + next if $no_recurse && $d ne $dir; + next if $dir ne $d && $dir !~ /^\Q$d\E/; push @repos, [$dir, $topdir, $subdir]; } } @@ -398,10 +411,19 @@ sub action { #{{{ my $test="set -e;".$lib.$config{$topdir}{$subdir}{deleted}; print "mr $action: running deleted test >>$test<<\n" if $verbose; my $ret=system($test); - if ($ret >> 8 == 0) { - print STDERR "mr error: $dir should be deleted yet still exists\n\n"; - push @failed, $dir; - return; + if ($ret != 0) { + if (($? & 127) == 2) { + print STDERR "mr $action: interrupted\n"; + exit 2; + } + elsif ($? & 127) { + print STDERR "mr $action: deleted test received signal ".($? & 127)."\n"; + } + if ($ret >> 8 == 0) { + print STDERR "mr error: $dir should be deleted yet still exists\n\n"; + push @failed, $dir; + return; + } } } } @@ -412,7 +434,13 @@ sub action { #{{{ push @skipped, $dir; return; } + $dir=~s/^(.*)\/[^\/]+\/?$/$1/; + + if (! -d $dir) { + print "mr $action: creating parent directory $dir\n" if $verbose; + my $ret=system("mkdir", "-p", $dir); + } } elsif ($action eq 'update') { if (! -d $dir) { @@ -427,10 +455,20 @@ sub action { #{{{ "my_action(){ $config{$topdir}{$subdir}{skip}\n }; my_action '$action'"; print "mr $action: running skip test >>$test<<\n" if $verbose; my $ret=system($test); - if ($ret >> 8 == 0) { - print "mr $action: $dir skipped per config file\n" if $verbose; - push @skipped, $dir; - return; + if ($ret != 0) { + if (($? & 127) == 2) { + print STDERR "mr $action: interrupted\n"; + exit 2; + } + elsif ($? & 127) { + print STDERR "mr $action: skip test received signal ".($? & 127)."\n"; + exit 1; + } + if ($ret >> 8 == 0) { + print "mr $action: $dir skipped per config file\n" if $verbose; + push @skipped, $dir; + return; + } } } @@ -455,6 +493,13 @@ sub action { #{{{ print STDERR "mr $action: running >>$command<<\n" if $verbose; my $ret=system($command); if ($ret != 0) { + if (($? & 127) == 2) { + print STDERR "mr $action: interrupted\n"; + exit 2; + } + elsif ($? & 127) { + print STDERR "mr $action: received signal ".($? & 127)."\n"; + } print STDERR "mr $action: failed ($ret)\n" if $verbose; push @failed, $dir; if ($ret >> 8 != 0) { @@ -500,7 +545,7 @@ if ($stats) { print "mr $action: (skipped: ".join(" ", @skipped).")\n"; } if (@failed) { - print "mr $action: (failed: ".join(" ", @failed).")\n"; + print STDERR "mr $action: (failed: ".join(" ", @failed).")\n"; } } if (@failed) { @@ -601,9 +646,20 @@ sub loadconfig { #{{{ $knownactions{$parameter}=1; if ($parameter eq 'chain' && length $dir && $section ne "DEFAULT" && - -e $dir.$section."/.mrconfig" && - system($value) >> 8 == 0) { - push @toload, $dir.$section."/.mrconfig"; + -e $dir.$section."/.mrconfig") { + my $ret=system($value); + if ($ret != 0) { + if (($? & 127) == 2) { + print STDERR "mr $action: chain test interrupted\n"; + exit 2; + } + elsif ($? & 127) { + print STDERR "mr $action: chain test received signal ".($? & 127)."\n"; + } + } + else { + push @toload, $dir.$section."/.mrconfig"; + } } } }