]> 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:

add mr list command, and clarify what repos it will choose to act on
[code/myrepos.git] / mr
diff --git a/mr b/mr
index 577fa85a60aac12cc115c710fcaf3e37adf6c4d6..823e3df3ea1f989c9930684e8a12528409af804a 100755 (executable)
--- a/mr
+++ b/mr
@@ -14,6 +14,8 @@ B<mr> [options] status
 
 B<mr> [options] commit [-m "message"]
 
 
 B<mr> [options] commit [-m "message"]
 
+B<mr> [options] diff
+
 B<mr> [options] action [params ...]
 
 =head1 DESCRIPTION
 B<mr> [options] action [params ...]
 
 =head1 DESCRIPTION
@@ -32,33 +34,52 @@ control system:
 
 =item checkout (or co)
 
 
 =item checkout (or co)
 
-Checks out all the registered repositories that are not already checked
-out.
+Checks out any repositories that are not already checked out.
 
 =item update
 
 
 =item update
 
-Updates each registered repository from its configured remote repository.
+Updates each repository from its configured remote repository.
 
 If a repository isn't checked out yet, it will first check it out.
 
 =item status
 
 
 If a repository isn't checked out yet, it will first check it out.
 
 =item status
 
-Displays a status report for each registered repository, showing what
+Displays a status report for each repository, showing what
 uncommitted changes are present in the repository.
 
 =item commit (or ci)
 
 uncommitted changes are present in the repository.
 
 =item commit (or ci)
 
-Commits changes to each registered repository. (By default, changes
-are pushed to the remote repository too, when using distributed systems
-like git.)
+Commits changes to each repository. (By default, changes are pushed to the
+remote repository too, when using distributed systems like git.)
 
 The optional -m parameter allows specifying a commit message.
 
 
 The optional -m parameter allows specifying a commit message.
 
+=item diff
+
+Show a diff of uncommitted changes.
+
+=item list
+
+List the repositories that mr will act on.
+
+=item help
+
+Displays this help.
+
 =back
 
 Actions can be abbreviated to any unambiguous subsctring, so
 "mr st" is equivilant to "mr status".
 
 =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, it will act on
+only that repository.
+
+Additional parameters can be passed to other commands than "commit", they
+will be passed on unchanged to the underlying revision control system.
+This is mostly useful if the repositories mr will act on all use the same
+revision control system.
+
 =head1 OPTIONS
 
 =over 4
 =head1 OPTIONS
 
 =over 4
@@ -167,7 +188,9 @@ my $result=GetOptions(
        "v" => \$verbose,
 );
 if (! $result || @ARGV < 1) {
        "v" => \$verbose,
 );
 if (! $result || @ARGV < 1) {
-       die("Usage: mr [-d directory] action [params ...]\n");
+       die("Usage: mr [-d directory] action [params ...]\n".
+           "(Use mr help for man page.)\n");
+
 }
 
 loadconfig(\*DATA);
 }
 
 loadconfig(\*DATA);
@@ -175,6 +198,11 @@ loadconfig($config);
 #use Data::Dumper;
 #print Dumper(\%config);
 
 #use Data::Dumper;
 #print Dumper(\%config);
 
+eval {
+       use FindBin qw($Bin $Script);
+       $ENV{MR_PATH}=$Bin."/".$Script;
+};
+
 # alias expansion and command stemming
 my $action=shift @ARGV;
 if (! exists $knownactions{$action}) {
 # alias expansion and command stemming
 my $action=shift @ARGV;
 if (! exists $knownactions{$action}) {
@@ -193,6 +221,10 @@ if (! exists $knownactions{$action}) {
        }
 }
 
        }
 }
 
+if ($action eq 'help') {
+       exec($config{''}{default}{help});
+}
+
 # handle being in a subdir of a repository
 foreach my $topdir (sort keys %config) {
        foreach my $subdir (sort keys %{$config{$topdir}}) {
 # handle being in a subdir of a repository
 foreach my $topdir (sort keys %config) {
        foreach my $subdir (sort keys %{$config{$topdir}}) {
@@ -203,7 +235,6 @@ foreach my $topdir (sort keys %config) {
 }
 
 my (@failed, @successful, @skipped);
 }
 
 my (@failed, @successful, @skipped);
-my $first=1;
 foreach my $topdir (sort keys %config) {
        foreach my $subdir (sort keys %{$config{$topdir}}) {
                next if $subdir eq 'default';
 foreach my $topdir (sort keys %config) {
        foreach my $subdir (sort keys %{$config{$topdir}}) {
                next if $subdir eq 'default';
@@ -216,11 +247,7 @@ foreach my $topdir (sort keys %config) {
                        next;
                }
 
                        next;
                }
 
-               print "\n" unless $first;
-               $first=0;
-
                action($action, $dir, $topdir, $subdir);
                action($action, $dir, $topdir, $subdir);
-
        }
 }
 
        }
 }
 
@@ -263,7 +290,7 @@ sub action {
                push @skipped, $dir;
        }
        else {
                push @skipped, $dir;
        }
        else {
-               print "mr $action: in $dir\n";
+               print "mr $action: $dir\n";
                my $command="set -e; ".$lib.
                        "my_action(){ $config{$topdir}{$subdir}{$action} ; }; my_action ".
                        join(" ", map { s/\//\/\//g; s/"/\"/g; '"'.$_.'"' } @ARGV);
                my $command="set -e; ".$lib.
                        "my_action(){ $config{$topdir}{$subdir}{$action} ; }; my_action ".
                        join(" ", map { s/\//\/\//g; s/"/\"/g; '"'.$_.'"' } @ARGV);
@@ -281,6 +308,8 @@ sub action {
                else {
                        push @successful, $dir;
                }
                else {
                        push @successful, $dir;
                }
+
+               print "\n";
        }
 }
 
        }
 }
 
@@ -293,7 +322,7 @@ sub showstat {
        }
        return;
 }
        }
        return;
 }
-print "\nmr $action: finished (".join("; ",
+print "mr $action: finished (".join("; ",
        showstat($#successful+1, "successful", "successful"),
        showstat($#failed+1, "failed", "failed"),
        showstat($#skipped+1, "skipped", "skipped"),
        showstat($#successful+1, "successful", "successful"),
        showstat($#failed+1, "failed", "failed"),
        showstat($#skipped+1, "skipped", "skipped"),
@@ -435,3 +464,18 @@ commit = \
        else \
                error "unknown repo type"; \
        fi
        else \
                error "unknown repo type"; \
        fi
+diff = \
+       if [ -d .svn ]; then \
+               svn diff "$@"; \
+       elif [ -d .git ]; then \
+               git diff "$@"; \
+       else \
+               error "unknown repo type"; \
+       fi
+list = true
+help = \
+       if [ ! -e "$MR_PATH" ]; then \
+               error "cannot find program path";\
+       fi; \
+       (pod2man -c mr "$MR_PATH" | man -l -) || \
+               error "pod2man or man failed"