X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/900fe2548852e975ce41e04bfd5ef155c44821f0..82688d628f05af1fceb96026311ad6b3a9c66b3a:/mr diff --git a/mr b/mr index d48fd61..72c917c 100755 --- a/mr +++ b/mr @@ -54,6 +54,11 @@ like git.) The optional -m parameter allows specifying a commit message. +=back + +Actions can be abbreviated to any unambiguous subsctring, so +"mr st" is equivilant to "mr status". + =head1 OPTIONS =over 4 @@ -132,6 +137,7 @@ my $directory=getcwd(); my $config="$ENV{HOME}/.mrconfig"; my $verbose=0; my %config; +my %knownactions; Getopt::Long::Configure("no_permute"); my $result=GetOptions( @@ -142,14 +148,24 @@ my $result=GetOptions( if (! $result || @ARGV < 1) { die("Usage: mr [-d directory] action [params ...]\n"); } -my $action=shift @ARGV; loadconfig(\*DATA); loadconfig($config); #use Data::Dumper; #print Dumper(\%config); -my (@failures, @successes, @skipped); +my $action=shift @ARGV; +if (! $knownactions{$action}) { + my @matches = grep { /^\Q$action\E/ } keys %knownactions; + if (@matches == 1) { + $action=$matches[0]; + } + else { + die "mr: ambiguous action \"$action\" (matches @matches)\n"; + } +} + +my (@failed, @successful, @skipped); my $first=1; foreach my $topdir (sort keys %config) { foreach my $subdir (sort keys %{$config{$topdir}}) { @@ -209,11 +225,12 @@ sub action { } else { print "mr $action: in $dir\n"; - my $command="set -e; my_action(){ $config{$topdir}{$subdir}{$action} ; }; my_action @ARGV"; + my $command="set -e; my_action(){ $config{$topdir}{$subdir}{$action} ; }; my_action ". + join(" ", map { s/\//\/\//g; s/"/\"/g; '"'.$_.'"' } @ARGV); my $ret=system($command); if ($ret != 0) { print STDERR "mr $action: failed to run: $command\n" if $verbose; - push @failures, $topdir.$subdir; + push @failed, $topdir.$subdir; if ($ret >> 8 != 0) { print STDERR "mr $action: command failed\n"; } @@ -222,7 +239,7 @@ sub action { } } else { - push @successes, $dir; + push @successful, $dir; } } } @@ -237,11 +254,11 @@ sub showstat { return; } print "\nmr $action: finished (".join("; ", - showstat($#successes+1, "success", "successes"), - showstat($#failures+1, "failure", "failures"), + showstat($#successful+1, "successful", "successful"), + showstat($#failed+1, "failed", "failed"), showstat($#skipped+1, "skipped", "skipped"), ).")\n"; -exit @failures ? 1 : 0; +exit @failed ? 1 : 0; my %loaded; sub loadconfig { @@ -312,6 +329,7 @@ sub loadconfig { $config{$dir}{$section}={ %{$config{$dir}{default}} }; } $config{$dir}{$section}{$parameter}=$value; + $knownactions{$parameter}=1; } else { die "$f line $.: parse error\n"; @@ -334,7 +352,7 @@ update = \ elif [ -d .git ]; then \ git pull origin master; \ else \ - echo "mr update: unknown RCS"; \ + echo "mr update: unknown repo type"; \ exit 1; \ fi status = \ @@ -343,15 +361,15 @@ status = \ elif [ -d .git ]; then \ git status || true; \ else \ - echo "mr status: unknown RCS"; \ + echo "mr status: unknown repo type"; \ exit 1; \ fi commit = \ if [ -d .svn ]; then \ svn commit "$@"; \ elif [ -d .git ]; then \ - git commit -a "$@"; \ + git commit -a "$@" \ else \ - echo "mr commit: unknown RCS"; \ + echo "mr commit: unknown repo type"; \ exit 1; \ fi