]> git.madduck.net Git - code/myrepos.git/commitdiff

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:

Added fixups hook, which can be used to run a command after a repository is checked...
authorJoey Hess <joey@kitenet.net>
Sun, 29 Aug 2010 18:44:18 +0000 (14:44 -0400)
committerJoey Hess <joey@kitenet.net>
Sun, 29 Aug 2010 18:44:18 +0000 (14:44 -0400)
debian/changelog
mr
mrconfig.complex

index a5a24d096a96e3e1e2753f33f93e69c780e9fc4c..52249eda00f5d1ad15be43511bf7fec8faea7433 100644 (file)
@@ -1,6 +1,8 @@
 mr (0.50) UNRELEASED; urgency=low
 
   * Now supports the Fossil VCS. (Thanks, Jimmy Tang)
+  * Added fixups hook, which can be used to run a command after
+    a repository is checked out or updated. Closes: #590868
 
  -- Joey Hess <joeyh@debian.org>  Sun, 15 Aug 2010 12:36:34 -0400
 
diff --git a/mr b/mr
index 6df8cd72949a3447f103ec0b1f228f1339018cde..03cfdf351755dbbc9125517827ad47f4b3742701 100755 (executable)
--- a/mr
+++ b/mr
@@ -370,6 +370,13 @@ The "lib" parameter can specify some shell code that will be run before each
 command, this can be a useful way to define shell functions for other commands
 to use.
 
+=item fixups
+
+If the "fixups" parameter is set, its command is run whenever a repository
+is checked out, or updated. This provides an easy way to do things
+like permissions fixups, or other tweaks to the repository content,
+whenever the repository is changed.
+
 =back
 
 When looking for a command to run for a given action, mr first looks for
@@ -524,6 +531,7 @@ sub action {
        my $lib=exists $config{$topdir}{$subdir}{lib} ?
                       $config{$topdir}{$subdir}{lib}."\n" : "";
        my $is_checkout=($action eq 'checkout');
+       my $is_update=($action =~ /update/);
 
        $ENV{MR_REPO}=$dir;
 
@@ -537,7 +545,7 @@ sub action {
                        $dir=~s/^(.*)\/[^\/]+\/?$/$1/;
                }
        }
-       elsif ($action =~ /update/) {
+       elsif ($is_update) {
                if (! -d $dir) {
                        return action("checkout", $dir, $topdir, $subdir);
                }
@@ -628,16 +636,46 @@ sub action {
                        return FAILED;
                }
                else {
-                       if ($action eq 'checkout' && ! -d $dir) {
+                       if ($is_checkout && ! -d $dir) {
                                print STDERR "mr $action: $dir missing after checkout\n";;
                                return FAILED;
                        }
 
+                       if (($is_checkout || $is_update)) {
+                               my $ret=hook("fixups", $topdir, $subdir);
+                               return $ret if $ret != OK;
+                       }
+
                        return OK;
                }
        }
 }
 
+sub hook {
+       my ($hook, $topdir, $subdir) = @_;
+
+       my $command=$config{$topdir}{$subdir}{$hook};
+       return OK unless defined $command;
+       my $lib=exists $config{$topdir}{$subdir}{lib} ?
+                      $config{$topdir}{$subdir}{lib}."\n" : "";
+       my $shell="set -e;".$lib.
+               "my_hook(){ $command\n }; my_hook";
+       print "mr $hook: running >>$shell<<\n" if $verbose;
+       my $ret=system($shell);
+       if ($ret != 0) {
+               if (($? & 127) == 2) {
+                       print STDERR "mr $hook: interrupted\n";
+                       return ABORT;
+               }
+               elsif ($? & 127) {
+                       print STDERR "mr $hook: received signal ".($? & 127)."\n";
+                       return ABORT;
+               }
+       }
+
+       return OK;
+}
+
 # run actions on multiple repos, in parallel
 sub mrs {
        my $action=shift;
index 5924de146e714d2d5dace3b3c075c0e095960a54..a80e981819f7b226c0b8fc97bc11e0814a375981 100644 (file)
@@ -79,8 +79,8 @@ skip = ! mylaptop
 [tmp]
 # This is a dummy target, all it does is run fixups at the end of
 # an update.
-update = $HOME/bin/fixups
-checkout = $HOME/bin/fixups
+fixups = $HOME/bin/fixups
+checkout = mkdir -p $HOME/tmp
 status = :
 order = 25