B<mr> [options] diff
+B<mr> [options] log
+
B<mr> [options] action [params ...]
=head1 DESCRIPTION
Any mix of revision control systems can be used with B<mr>, and you can
define arbitrary actions for commands like "update", "checkout", or "commit".
+B<mr> cds into and operates on all registered repsitories at or below your
+working directory. Or, if you are in a subdirectory of a repository that
+contains no other registered repositories, it will stay in that directory,
+and work on only that repository,
+
The predefined commands should be fairly familiar to users of any revision
control system:
Show a diff of uncommitted changes.
+=item log
+
+Show the commit log.
+
=item list
List the repositories that mr will act on.
=back
Actions can be abbreviated to any unambiguous subsctring, so
-"mr st" is equivilant to "mr status".
-
-B<mr> operates on all registered repsitories at or below your working
-directory. Or, if you are in a subdirectory of a repository that contains
-no other registered repositories, it will act on only that repository.
+"mr st" is equivilant to "mr status", and "mr up" is equivilant to "mr
+update"
Additional parameters can be passed to other commands than "commit", they
will be passed on unchanged to the underlying revision control system.
=item -c mrconfig
-Use the specified mrconfig file, instead of looking for on in your home
+Use the specified mrconfig file, instead of looking for one in your home
directory.
=item -v
if (@matches == 1) {
$action=$matches[0];
}
+ elsif (@matches == 0) {
+ die "mr: unknown action \"$action\" (known actions: ".
+ join(", ", sort keys %knownactions).")\n";
+ }
else {
- die "mr: ambiguous action \"$action\" (matches @matches)\n";
+ die "mr: ambiguous action \"$action\" (matches: ".
+ join(", ", @matches).")\n";
}
}
}
my $nochdir=0;
foreach my $topdir (sort keys %config) {
foreach my $subdir (sort keys %{$config{$topdir}}) {
+ next if $subdir eq 'default';
my $dir=$topdir.$subdir;
next if $dir ne $directory && $dir !~ /^\Q$directory\E\//;
push @repos, [$dir, $topdir, $subdir];
}
if (! @repos) {
# fallback to find a leaf repo
- foreach my $topdir (sort keys %config) {
- foreach my $subdir (sort keys %{$config{$topdir}}) {
+ LEAF: foreach my $topdir (reverse sort keys %config) {
+ foreach my $subdir (reverse sort keys %{$config{$topdir}}) {
+ next if $subdir eq 'default';
my $dir=$topdir.$subdir;
my $d=$directory;
$dir.="/" unless $dir=~/\/$/;
$d.="/" unless $d=~/\/$/;
if ($d=~/^\Q$dir\E/) {
push @repos, [$dir, $topdir, $subdir];
+ last LEAF;
}
}
}
- if (@repos > 1) {
- die "mr: found multiple leaf repos (should never happen)";
- }
+ $nochdir=1;
}
my (@failed, @successful, @skipped);
push @skipped, $dir;
}
else {
- print "mr $action: $dir\n";
+ if (! $nochdir) {
+ print "mr $action: $dir\n";
+ }
+ else {
+ print "mr $action: $dir (in subdir $directory)\n";
+ }
my $command="set -e; ".$lib.
"my_action(){ $config{$topdir}{$subdir}{$action} ; }; my_action ".
join(" ", map { s/\//\/\//g; s/"/\"/g; '"'.$_.'"' } @ARGV);
else \
error "unknown repo type"; \
fi
+log = \
+ if [ -d "$MR_REPO"/.svn ]; then \
+ svn log"$@"; \
+ elif [ -d "$MR_REPO"/.git ]; then \
+ git log "$@"; \
+ else \
+ error "unknown repo type"; \
+ fi
list = true
help = \
if [ ! -e "$MR_PATH" ]; then \