X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/1b7137c19b38431c79b41d1dfde73ef76f826836..3cba68134c64156e30c1c19148c1e73990e7a2f1:/mr?ds=sidebyside diff --git a/mr b/mr index 4fc7971..2e5b03d 100755 --- a/mr +++ b/mr @@ -7,7 +7,7 @@ mr - a Multiple Repository management tool =head1 SYNOPSIS - +/ B [options] checkout B [options] update @@ -28,6 +28,10 @@ B [options] config section ["parameter=[value]" ...] B [options] action [params ...] +B [options] [online|offline] + +B [options] remember action [params ...] + =head1 DESCRIPTION B is a Multiple Repository management tool. It can checkout, update, or @@ -126,6 +130,24 @@ To see the built-in library of shell functions contained in mr: The ~/.mrconfig file is used by default. To use a different config file, use the -c option. +=item offline + +Advises mr that it is in offline mode. Any commands that fail in +offline mode will be remembered, and retried when mr is told it's online. + +=item online + +Advices mr that it is in online mode again. Commands that failed while in +offline mode will be re-run. + +=item remember + +Remember a command, to be run later when mr re-enters online mode. This +implicitly puts mr into offline mode. The command can be any regular mr +command. This is useful when you know that a command will fail due to being +offline, and so don't want to run it right now at all, but just remember +to run it when you go back online. + =item help Displays this help. @@ -196,6 +218,11 @@ a good speedup in updates without loading the machine too much. =head1 FILES +The ~/.mrlog file contains commands that mr has remembered to run later, +due to being offline. You can delete or edit this file to remove commands, +or even to add other commands for 'mr online' to run. If the file is +present, mr assumes it is in offline mode. + B is configured by .mrconfig files. It starts by reading the .mrconfig file in your home directory, and this can in turn chain load .mrconfig files from repositories. @@ -354,6 +381,7 @@ my %configfiles; my %knownactions; my %alias; my (@ok, @failed, @skipped); +my @switches=@ARGV; main(); @@ -511,6 +539,10 @@ sub action { #{{{ print STDERR "mr $action: failed ($ret)\n" if $verbose; if ($ret >> 8 != 0) { print STDERR "mr $action: command failed\n"; + if (-e "$ENV{HOME}/.mrlog" && $action ne 'remember') { + @ARGV=(@switches, $action, @ARGV); + action("remember", $dir, $topdir, $subdir); + } } elsif ($ret != 0) { print STDERR "mr $action: command died ($ret)\n"; @@ -973,6 +1005,11 @@ sub dispatch { #{{{ elsif ($action eq 'register') { register(@ARGV); } + elsif ($action eq 'remember') { + my @repos=selectrepos; + action($action, @{$repos[0]}) if @repos; + exit 0; + } if (!$jobs || $jobs > 1) { mrs($action, selectrepos()); @@ -987,7 +1024,7 @@ sub dispatch { #{{{ sub help { #{{{ exec($config{''}{DEFAULT}{help}) || die "exec: $!"; } #}}} - + sub config { #{{{ if (@_ < 2) { die "mr config: not enough parameters\n"; @@ -1028,8 +1065,11 @@ sub config { #{{{ sub register { #{{{ if ($config_overridden) { - ($directory)=$ENV{MR_CONFIG}=~/^(.*\/)[^\/]+$/; - } else { + # Find the directory that the specified config file is + # located in. + ($directory)=abs_path($ENV{MR_CONFIG})=~/^(.*\/)[^\/]+$/; + } + else { # Find the closest known mrconfig file to the current # directory. $directory.="/" unless $directory=~/\/$/; @@ -1137,11 +1177,15 @@ sub init { #{{{ sub main { #{{{ getopts(); init(); + loadconfig(\*DATA); loadconfig($ENV{MR_CONFIG}); #use Data::Dumper; print Dumper(\%config); + + my $action=shift @ARGV; + @switches = grep { $_ ne $action } @SWITCHES; + $action=expandaction($action); - my $action=expandaction(shift @ARGV); dispatch($action); showstats($action); @@ -1308,6 +1352,30 @@ help = list = true config = +online = + if [ -e ~/.mrlog ]; then + info "running offline commands" + mv -f ~/.mrlog ~/.mrlog.old + if ! sh ~/.mrlog.old; then + error "offline commands failed; left in ~/.mrlog.old" + fi + rm -f ~/.mrlog.old + else + info "no offline commands to run" + fi +offline = + touch ~/.mrlog + info "offline mode enabled" +remember = + info "remembering command: 'mr $@'" + command="mr -d '$(pwd)'" + for w in "$@"; do + command="$command '$w'" + done + if [ ! -e ~/.mrlog ] || ! grep -q -F "$command" ~/.mrlog; then + echo "$command" >> ~/.mrlog + fi + ed = echo "A horse is a horse, of course, of course.." T = echo "I pity the fool." right = echo "Not found."