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
my $config="$ENV{HOME}/.mrconfig";
my $verbose=0;
my %config;
+my %knownactions;
Getopt::Long::Configure("no_permute");
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}}) {
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";
}
}
}
else {
- push @successes, $dir;
+ push @successful, $dir;
}
}
}
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 {
$config{$dir}{$section}={ %{$config{$dir}{default}} };
}
$config{$dir}{$section}{$parameter}=$value;
+ $knownactions{$parameter}=1;
}
else {
die "$f line $.: parse error\n";
elif [ -d .git ]; then \
git pull origin master; \
else \
- echo "mr update: unknown RCS"; \
+ echo "mr update: unknown repo type"; \
exit 1; \
fi
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 "$@" && git push --all; \
else \
- echo "mr commit: unknown RCS"; \
+ echo "mr commit: unknown repo type"; \
exit 1; \
fi