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

changelog
[code/myrepos.git] / mr
diff --git a/mr b/mr
index abfa2e5187ec8d0512a6b612f0d7184cc5ecef89..4253be2680db007a6b806c98b008942f711e0391 100755 (executable)
--- a/mr
+++ b/mr
@@ -290,7 +290,7 @@ This obsolete flag is ignored.
 Here is an example .mrconfig file:
 
   [src]
-  checkout = svn co svn://svn.example.com/src/trunk src
+  checkout = svn checkout svn://svn.example.com/src/trunk src
   chain = true
 
   [src/linux-2.6]
@@ -317,14 +317,18 @@ will be passed through the shell for expansion. For example,
 
 Within a section, each parameter defines a shell command to run to handle a
 given action. mr contains default handlers for "update", "status",
-"commit", and other standard actions. Normally you only need to specify what
-to do for "checkout".
+"commit", and other standard actions.
+
+Normally you only need to specify what to do for "checkout". Here you
+specify the command to run in order to create a checkout of the repository.
+The command will be run in the parent directory, and must create the
+repository's directory. So use "git clone", "svn checkout", "bzr branch"
+or "bzr checkout" (for a bound branch), etc.
 
 Note that these shell commands are run in a "set -e" shell
 environment, where any additional parameters you pass are available in
-"$@". The "checkout" command is run in the parent of the repository
-directory, since the repository isn't checked out yet. All other commands
-are run inside the repository, though not necessarily at the top of it.
+"$@". All commands other than "checkout" are run inside the repository,
+though not necessarily at the top of it.
 
 The "MR_REPO" environment variable is set to the path to the top of the
 repository. (For the "register" action, "MR_REPO" is instead set to the 
@@ -335,6 +339,9 @@ The "MR_CONFIG" environment variable is set to the .mrconfig file
 that defines the repo being acted on, or, if the repo is not yet in a config
 file, the .mrconfig file that should be modified to register the repo.
 
+The "MR_ACTION" environment variable is set to the command being run
+(update, checkout, etc).
+
 A few parameters have special meanings:
 
 =over 4
@@ -350,8 +357,21 @@ mr is run by joey. The second uses the hours_since function
 (included in mr's built-in library) to skip updating the repo unless it's
 been at least 12 hours since the last update.
 
+  [mystuff]
+  checkout = ...
   skip = test `whoami` != joey
+
+  [linux]
+  checkout = ...
   skip = [ "$1" = update ] && ! hours_since "$1" 12
+Another way to use skip is for a lazy checkout. This makes mr skip
+operating on a repo unless it already exists. To enable the 
+repo, you have to explicitly check it out (using "mr -d foo checkout").
+
+  [foo]
+  checkout = ...
+  skip = lazy
 
 =item order
 
@@ -377,6 +397,14 @@ part of the including file.
 Unlike all other parameters, this parameter does not need to be placed
 within a section.
 
+B<mr> ships several libraries that can be included to add support for
+additional version control type things (unison, git-svn, vcsh, git-fake-bare,
+git-subtree). To include them all, you could use:
+
+  include = cat /usr/share/mr/*
+
+See the individual files for details.
+
 =item deleted
 
 If the "deleted" parameter is set and its command returns true, then
@@ -575,6 +603,7 @@ sub action {
        my $is_update=($action =~ /update/);
 
        $ENV{MR_REPO}=$dir;
+       $ENV{MR_ACTION}=$action;
        
        foreach my $testname ("skip", "deleted") {
                my $testcommand=findcommand($testname, $dir, $topdir, $subdir, $is_checkout);
@@ -751,6 +780,9 @@ sub hook {
                        print STDERR "mr $hook: received signal ".($? & 127)."\n";
                        return ABORT;
                }
+               else {
+                       return FAILED;
+               }
        }
 
        return OK;
@@ -1231,21 +1263,26 @@ sub loadconfig {
                                        $knownactions{$parameter}=1;
                                }
                                if ($parameter eq 'chain' &&
-                                   length $dir && $section ne "DEFAULT" &&
-                                   -e $dir.$section."/.mrconfig") {
-                                       my $ret=system($value);
-                                       if ($ret != 0) {
-                                               if (($? & 127) == 2) {
-                                                       print STDERR "mr: chain test interrupted\n";
-                                                       exit 2;
+                                   length $dir && $section ne "DEFAULT") {
+                                       my $chaindir="$section";
+                                       if ($chaindir !~ m!/!) {
+                                               $chaindir=$dir.$chaindir;
+                                       }
+                                       if (-e "$chaindir/.mrconfig") {
+                                               my $ret=system($value);
+                                               if ($ret != 0) {
+                                                       if (($? & 127) == 2) {
+                                                               print STDERR "mr: chain test interrupted\n";
+                                                               exit 2;
+                                                       }
+                                                       elsif ($? & 127) {
+                                                               print STDERR "mr: chain test received signal ".($? & 127)."\n";
+                                                       }
                                                }
-                                               elsif ($? & 127) {
-                                                       print STDERR "mr: chain test received signal ".($? & 127)."\n";
+                                               else {
+                                                       push @toload, ["$chaindir/.mrconfig", $chaindir];
                                                }
                                        }
-                                       else {
-                                               push @toload, $dir.$section."/.mrconfig";
-                                       }
                                }
                        }
                }
@@ -1254,8 +1291,8 @@ sub loadconfig {
                }
        }
 
-       foreach (@toload) {
-               loadconfig($_);
+       foreach my $c (@toload) {
+               loadconfig(@$c);
        }
 }
 
@@ -1691,6 +1728,13 @@ lib =
        is_bzr_checkout() {
                LANG=C bzr info | egrep -q '^Checkout'
        }
+       lazy() {
+               if [ "$MR_ACTION" = checkout ] || [ -d "$MR_REPO" ]; then
+                       return 1
+               else
+                       return 0
+               fi
+       }
 
 svn_test = test -d "$MR_REPO"/.svn
 git_test = test -d "$MR_REPO"/.git
@@ -1739,7 +1783,12 @@ darcs_commit = darcs record -a -m "$@" && darcs push -a
 fossil_commit = fossil commit "$@"
 
 git_record = git commit -a "$@"
-bzr_record = bzr commit "$@"
+bzr_record =
+       if is_bzr_checkout; then
+               bzr commit --local "$@"
+       else
+               bzr commit "$@"
+       fi
 hg_record  = hg commit -m "$@"
 darcs_record = darcs record -a -m "$@"
 fossil_record = fossil commit "$@"