X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/0c0234720e16c53190a4705ad24f86187ec23dc1..379abaa4ed00707a7fd7bf8f596126914b06249b:/mr?ds=sidebyside

diff --git a/mr b/mr
index abfa2e5..4253be2 100755
--- 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 "$@"