X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/b1811adc60f81bcc868bd5484e2b5f365e068a51..adecd54561d17629cb8ca2ec793867ff997f3c0e:/mr diff --git a/mr b/mr index 06b58e3..02483f6 100755 --- a/mr +++ b/mr @@ -7,7 +7,7 @@ mr - a Multiple Repository management tool =head1 SYNOPSIS -/ + B [options] checkout B [options] update @@ -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); + # 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) { @@ -840,6 +848,9 @@ sub loadconfig { #{{{ if ($parameter eq "include") { print "mr: including output of \"$value\"\n" if $verbose; unshift @lines, `$value`; + if ($?) { + print STDERR "mr: include command exited nonzero ($?)\n"; + } next; } @@ -1005,7 +1016,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 +1146,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 +1162,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 +1202,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 +1298,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,22 +1377,23 @@ 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 info "no offline commands to run" fi offline = + umask 077 touch ~/.mrlog 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