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

Add an offline mode
authorJoey Hess <joey@kodama.kitenet.net>
Thu, 26 Jun 2008 21:36:38 +0000 (17:36 -0400)
committerJoey Hess <joey@kodama.kitenet.net>
Thu, 26 Jun 2008 21:48:12 +0000 (17:48 -0400)
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. :-)

TODO
debian/changelog
debian/control
mr

diff --git a/TODO b/TODO
index a2255dbbf739a9ab46b856cc5675a3dd0b821d09..511ed8bf2f6e7768e26cad94533728b3fa77e8a8 100644 (file)
--- a/TODO
+++ b/TODO
 
   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 <command>",
-  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.
index 36e3a9db0606902eab987bea5fd43cbb633c6cb3..088daeb4252b9feb21f5427359d98b1ef6f35418 100644 (file)
@@ -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 <joeyh@debian.org>  Thu, 26 Jun 2008 17:02:26 -0400
+
 mr (0.30) unstable; urgency=low
 
   [ martin f. krafft ]
index b1c606c12cfb6257954b391e4e10b0fcc169d5d0..5a24c80677e3a2e5d015909368fe582e9b8b96f9 100644 (file)
@@ -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 3148a3f94fba74eb4a857642fbe5595e5db5d8f7..a58b52ba1a719b08208ee04fa01014e9535d41bf 100755 (executable)
--- a/mr
+++ b/mr
@@ -7,7 +7,7 @@
 mr - a Multiple Repository management tool
 
 =head1 SYNOPSIS
-
+/
 B<mr> [options] checkout
 
 B<mr> [options] update
@@ -28,6 +28,10 @@ B<mr> [options] config section ["parameter=[value]" ...]
 
 B<mr> [options] action [params ...]
 
+B<mr> [options] [online|offline]
+
+B<mr> [options] remember action [params ...]
+
 =head1 DESCRIPTION
 
 B<mr> 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<mr> 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."