From: Joey Hess Date: Sun, 29 Aug 2010 18:44:18 +0000 (-0400) Subject: Added fixups hook, which can be used to run a command after a repository is checked... X-Git-Url: https://git.madduck.net/code/myrepos.git/commitdiff_plain/099544fdb010d083124839e3bde9c3c1e39d89a5 Added fixups hook, which can be used to run a command after a repository is checked out or updated. Closes: #590868 --- diff --git a/debian/changelog b/debian/changelog index a5a24d0..52249ed 100644 --- a/debian/changelog +++ b/debian/changelog @@ -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 Sun, 15 Aug 2010 12:36:34 -0400 diff --git a/mr b/mr index 6df8cd7..03cfdf3 100755 --- 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; diff --git a/mrconfig.complex b/mrconfig.complex index 5924de1..a80e981 100644 --- a/mrconfig.complex +++ b/mrconfig.complex @@ -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