X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/b1bcef3dd99ffcc1d7140fad5b3a72bebff4a571..74bd847756134ad41c3f0fcccbd1e0063eccaf65:/mr?ds=inline diff --git a/mr b/mr index d5424ca..f1ca9f6 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 @@ -575,6 +595,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 +772,9 @@ sub hook { print STDERR "mr $hook: received signal ".($? & 127)."\n"; return ABORT; } + else { + return FAILED; + } } return OK; @@ -1059,7 +1083,7 @@ sub is_trusted_checkout { is_trusted_repo($words[$c]) ); } - elsif (defined $words[$c] && $twords[$c] eq $words[$c]) { + elsif (defined $words[$c] && $words[$c]=~/^($twords[$c])$/) { $match=1; } else { @@ -1231,21 +1255,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 +1283,8 @@ sub loadconfig { } } - foreach (@toload) { - loadconfig($_); + foreach my $c (@toload) { + loadconfig(@$c); } } @@ -1688,6 +1717,16 @@ lib = return 0 fi } + 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 @@ -1703,7 +1742,12 @@ git_bare_test = svn_update = svn update "$@" git_update = git pull "$@" -bzr_update = bzr merge --pull "$@" +bzr_update = + if is_bzr_checkout; then + bzr update "$@" + else + bzr merge --pull "$@" + fi cvs_update = cvs update "$@" hg_update = hg pull "$@" && hg update "$@" darcs_update = darcs pull -a "$@" @@ -1719,14 +1763,24 @@ fossil_status = fossil changes "$@" svn_commit = svn commit "$@" git_commit = git commit -a "$@" && git push --all -bzr_commit = bzr commit "$@" && bzr push +bzr_commit = + if is_bzr_checkout; then + bzr commit "$@" + else + bzr commit "$@" && bzr push + fi cvs_commit = cvs commit "$@" hg_commit = hg commit -m "$@" && hg push 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 "$@" @@ -1778,7 +1832,7 @@ bzr_register = error "cannot determine bzr url" fi echo "Registering bzr url: $url in $MR_CONFIG" - mr -c "$MR_CONFIG" config "`pwd`" checkout="bzr clone '$url' '$MR_REPO'" + mr -c "$MR_CONFIG" config "`pwd`" checkout="bzr branch '$url' '$MR_REPO'" cvs_register = repo=`cat CVS/Repository` root=`cat CVS/Root` @@ -1811,7 +1865,7 @@ fossil_register = svn_trusted_checkout = svn co $url $repo svn_alt_trusted_checkout = svn checkout $url $repo git_trusted_checkout = git clone $url $repo -bzr_trusted_checkout = bzr clone $url $repo +bzr_trusted_checkout = bzr checkout|clone|branch|get $url $repo # cvs: too hard hg_trusted_checkout = hg clone $url $repo darcs_trusted_checkout = darcs get $url $repo