X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/6470d48aceaab27bd291303cfbb021b58629a013..0c0234720e16c53190a4705ad24f86187ec23dc1:/mr diff --git a/mr b/mr index 4235151..abfa2e5 100755 --- a/mr +++ b/mr @@ -377,6 +377,14 @@ part of the including file. Unlike all other parameters, this parameter does not need to be placed within a section. +=item deleted + +If the "deleted" parameter is set and its command returns true, then +B will treat the repository as deleted. It won't ever actually delete +the repository, but it will warn if it sees the repository's directory. +This is useful when one mrconfig file is shared amoung multiple machines, +to keep track of and remember to delete old repositories. + =item lib The "lib" parameter can specify some shell code that will be run before each @@ -567,6 +575,37 @@ sub action { my $is_update=($action =~ /update/); $ENV{MR_REPO}=$dir; + + foreach my $testname ("skip", "deleted") { + my $testcommand=findcommand($testname, $dir, $topdir, $subdir, $is_checkout); + + if (defined $testcommand) { + my $test="set -e;".$lib. + "my_action(){ $testcommand\n }; my_action '$action'"; + print "mr $action: running $testname test >>$test<<\n" if $verbose; + my $ret=system($test); + if ($ret != 0) { + if (($? & 127) == 2) { + print STDERR "mr $action: interrupted\n"; + return ABORT; + } + elsif ($? & 127) { + print STDERR "mr $action: $testname test received signal ".($? & 127)."\n"; + return ABORT; + } + } + if ($ret >> 8 == 0) { + if ($testname eq "deleted") { + if (-d $dir) { + print STDERR "mr error: $dir should be deleted yet still exists\n"; + return FAILED; + } + } + print "mr $action: skip $dir skipped\n" if $verbose; + return SKIPPED; + } + } + } if ($is_checkout) { if (! $force_checkout) { @@ -584,30 +623,8 @@ sub action { } } - my $skiptest=findcommand("skip", $dir, $topdir, $subdir, $is_checkout); my $command=findcommand($action, $dir, $topdir, $subdir, $is_checkout); - if (defined $skiptest) { - my $test="set -e;".$lib. - "my_action(){ $skiptest\n }; my_action '$action'"; - print "mr $action: running skip test >>$test<<\n" if $verbose; - my $ret=system($test); - if ($ret != 0) { - if (($? & 127) == 2) { - print STDERR "mr $action: interrupted\n"; - return ABORT; - } - elsif ($? & 127) { - print STDERR "mr $action: skip test received signal ".($? & 127)."\n"; - return ABORT; - } - } - if ($ret >> 8 == 0) { - print "mr $action: $dir skipped per config file\n" if $verbose; - return SKIPPED; - } - } - if ($is_checkout && ! -d $dir) { print "mr $action: creating parent directory $dir\n" if $verbose; system("mkdir", "-p", $dir); @@ -1042,7 +1059,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 { @@ -1167,13 +1184,23 @@ sub loadconfig { } if (! $trusted) { - # Untrusted files can only contain checkout - # parameters. - if ($parameter ne 'checkout') { - trusterror("mr: illegal setting \"$parameter=$value\"", $f, $line, $bootstrap_url); + # Untrusted files can only contain a few + # settings in specific known-safe formats. + if ($parameter eq 'checkout') { + if (! is_trusted_checkout($value)) { + trusterror("mr: illegal checkout command \"$value\"", $f, $line, $bootstrap_url); + } } - if (! is_trusted_checkout($value)) { - trusterror("mr: illegal checkout command \"$value\"", $f, $line, $bootstrap_url); + elsif ($parameter eq 'order') { + # not interpreted as a command, so + # safe. + } + elsif ($value eq 'true' || $value eq 'false') { + # skip=true , deleted=true etc are + # safe. + } + else { + trusterror("mr: illegal setting \"$parameter=$value\"", $f, $line, $bootstrap_url); } } @@ -1661,6 +1688,9 @@ lib = return 0 fi } + is_bzr_checkout() { + LANG=C bzr info | egrep -q '^Checkout' + } svn_test = test -d "$MR_REPO"/.svn git_test = test -d "$MR_REPO"/.git @@ -1676,7 +1706,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 "$@" @@ -1692,7 +1727,12 @@ 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 @@ -1751,7 +1791,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` @@ -1784,7 +1824,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