From: Joey Hess Date: Thu, 26 Jun 2008 21:36:38 +0000 (-0400) Subject: Add an offline mode X-Git-Url: https://git.madduck.net/code/myrepos.git/commitdiff_plain/056bfc218e74821f28990c305d695a02d35363a0?ds=inline Add an offline mode When in offline mode, mr will remember commands that failed (presumably due to lack of network access), and will run them again once back online. (This is for all the laptop users like me who don't want to have to remember which git repos to mr push when they come back from a nice long hack in the woods. :-) --- diff --git a/TODO b/TODO index a2255db..511ed8b 100644 --- a/TODO +++ b/TODO @@ -11,22 +11,3 @@ Until this is fixed, checkouts and updates need to be manually repeated after mrconfig files have changes. - -* offline support - - If I commit something to git while offline, it would be nice if mr could - have a way to push that change when I get online. - - One approach would be to notice when mr commit fails, and queue the - commit up to be tried happen again when "mr retry" is run. This could - also notice other failing commands, such as "mr up". - - Would it make sense to have to first run "mr offline", before mr starts - recording such failures? If so, "mr online" would be the thing to run - when getting back online, this would both retry queued commands, and stop - queuing new failures. - - One annoying thing is that, if offline, dns timeouts can take a while in - certian situations. So, it might be good to have a "mr remember ", - to directly add a command for mr to run when coming online, without - the need to run the command and wait for it to fail. diff --git a/debian/changelog b/debian/changelog index 36e3a9d..088daeb 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,13 @@ +mr (0.31) UNRELEASED; urgency=low + + * Add an offline mode. When in offline mode, mr will remember commands + that failed (presumably due to lack of network access), and will run + them again once back online. (This is for all the laptop users + like me who don't want to have to remember which git repos to mr push + when they come back from a nice long hack in the woods. :-) + + -- Joey Hess Thu, 26 Jun 2008 17:02:26 -0400 + mr (0.30) unstable; urgency=low [ martin f. krafft ] diff --git a/debian/control b/debian/control index b1c606c..5a24c80 100644 --- a/debian/control +++ b/debian/control @@ -28,3 +28,5 @@ Description: a Multiple Repository management tool and merge the two together. * Run several repository updates in parallel, greatly speeding up the update process. + * Remember actions that failed due to a laptop being offline, so they + can be retried when it comes back online. diff --git a/mr b/mr index 3148a3f..a58b52b 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. @@ -511,6 +538,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=($action, @ARGV); + action("remember", $dir, $topdir, $subdir); + } } elsif ($ret != 0) { print STDERR "mr $action: command died ($ret)\n"; @@ -973,6 +1004,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 +1023,7 @@ sub dispatch { #{{{ sub help { #{{{ exec($config{''}{DEFAULT}{help}) || die "exec: $!"; } #}}} - + sub config { #{{{ if (@_ < 2) { die "mr config: not enough parameters\n"; @@ -1311,6 +1347,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."