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

Support bzr checkouts, which are updated with "bzr update", and to which bzr automati...
[code/myrepos.git] / mr
diff --git a/mr b/mr
index 4235151895fa70daf0e917de9f9006b326aa3277..10a547f1ec979ff508a74b175e2d07a09b14a1bd 100755 (executable)
--- 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.
 
 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<mr> 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
 =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;
        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) {
 
        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);
 
        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);
        if ($is_checkout && ! -d $dir) {
                print "mr $action: creating parent directory $dir\n" if $verbose;
                system("mkdir", "-p", $dir);
@@ -1167,13 +1184,23 @@ sub loadconfig {
                        }
 
                        if (! $trusted) {
                        }
 
                        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
        }
                        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
 
 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 "$@"
 
 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 "$@"
 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
 
 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
 cvs_commit = cvs commit "$@"
 hg_commit  = hg commit -m "$@" && hg push
 darcs_commit = darcs record -a -m "$@" && darcs push -a