X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/3cba68134c64156e30c1c19148c1e73990e7a2f1..7ec67608cca6d2ca8095c2ebf0585e36431056ea:/mr?ds=sidebyside

diff --git a/mr b/mr
index 2e5b03d..883f4fb 100755
--- a/mr
+++ b/mr
@@ -81,6 +81,11 @@ remote repository. Only supported for distributed revision control systems.
 
 The optional -m parameter allows specifying a commit message.
 
+=item push
+
+Pushes committed local changes to the remote repository. A no-op for
+centralized revision control systems.
+
 =item diff
 
 Show a diff of uncommitted changes.
@@ -381,7 +386,6 @@ my %configfiles;
 my %knownactions;
 my %alias;
 my (@ok, @failed, @skipped);
-my @switches=@ARGV;
 
 main();
 
@@ -447,7 +451,7 @@ sub findcommand { #{{{
 
 sub action { #{{{
 	my ($action, $dir, $topdir, $subdir) = @_;
-
+	
 	$ENV{MR_CONFIG}=$configfiles{$topdir};
 	my $lib=exists $config{$topdir}{$subdir}{lib} ?
 	               $config{$topdir}{$subdir}{lib}."\n" : "";
@@ -540,8 +544,12 @@ sub action { #{{{
 			if ($ret >> 8 != 0) {
 				print STDERR "mr $action: command failed\n";
 				if (-e "$ENV{HOME}/.mrlog" && $action ne 'remember') {
-					@ARGV=(@switches, $action, @ARGV);
+					# recreate original command line to
+					# remember, and avoid recursing
+					my @orig=@ARGV;
+					@ARGV=('-n', $action, @orig);
 					action("remember", $dir, $topdir, $subdir);
+					@ARGV=@orig;
 				}
 			}
 			elsif ($ret != 0) {
@@ -1005,7 +1013,9 @@ sub dispatch { #{{{
 	elsif ($action eq 'register') {
 		register(@ARGV);
 	}
-	elsif ($action eq 'remember') {
+	elsif ($action eq 'remember' ||
+	       $action eq 'offline' ||
+	       $action eq 'online') {
 		my @repos=selectrepos;
 		action($action, @{$repos[0]}) if @repos;
 		exit 0;
@@ -1133,6 +1143,7 @@ sub expandaction { #{{{
 } #}}}
 
 sub getopts { #{{{
+	my @saved=@ARGV;
 	Getopt::Long::Configure("bundling", "no_permute");
 	my $result=GetOptions(
 		"d|directory=s" => sub { $directory=abs_path($_[1]) },
@@ -1148,6 +1159,12 @@ sub getopts { #{{{
 		die("Usage: mr [-d directory] action [params ...]\n".
 		    "(Use mr help for man page.)\n");
 	}
+	
+	$ENV{MR_SWITCHES}="";
+	foreach my $option (@saved) {
+		last if $option eq $ARGV[0];
+		$ENV{MR_SWITCHES}.="$option ";
+	}
 } #}}}
 
 sub init { #{{{
@@ -1182,10 +1199,7 @@ sub main { #{{{
 	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);
 
@@ -1281,6 +1295,13 @@ bzr_record = bzr commit "$@"
 hg_record  = hg commit -m "$@"
 darcs_record = darcs record -a -m "$@"
 
+svn_push = :
+git_push = git push "$@"
+bzr_push = bzr push "$@"
+cvs_push = :
+hg_push = hg push "$@"
+darcs_push = darcs push -a
+
 svn_diff = svn diff "$@"
 git_diff = git diff "$@"
 bzr_diff = bzr diff "$@"
@@ -1353,11 +1374,11 @@ list = true
 config = 
 
 online =
-	if [ -e ~/.mrlog ]; then
+	if [ -s ~/.mrlog ]; then
 		info "running offline commands"
 		mv -f ~/.mrlog ~/.mrlog.old
-		if ! sh ~/.mrlog.old; then
-			error "offline commands failed; left in ~/.mrlog.old"
+		if ! sh -e ~/.mrlog.old; then
+			error "offline command failed; left in ~/.mrlog.old"
 		fi
 		rm -f ~/.mrlog.old
 	else
@@ -1368,7 +1389,7 @@ offline =
 	info "offline mode enabled"
 remember =
 	info "remembering command: 'mr $@'"
-	command="mr -d '$(pwd)'"
+	command="mr -d '$(pwd)' $MR_SWITCHES"
 	for w in "$@"; do
 		command="$command '$w'"
 	done