X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/4bd430fa119cd49c5420219c87257d7725b438bc..46047e7a80111656bba297b17fa55353e3d83509:/mr?ds=inline diff --git a/mr b/mr index 3a729e4..3148a3f 100755 --- a/mr +++ b/mr @@ -16,6 +16,8 @@ B [options] status B [options] commit [-m "message"] +B [options] record [-m "message"] + B [options] diff B [options] log @@ -62,7 +64,16 @@ uncommitted changes are present in the repository. =item commit (or ci) Commits changes to each repository. (By default, changes are pushed to the -remote repository too, when using distributed systems like git.) +remote repository too, when using distributed systems like git. If you +don't like this default, you can change it in your .mrconfig, or use record +instead.) + +The optional -m parameter allows specifying a commit message. + +=item record + +Records changes to the local repository, but does not push them to the +remote repository. Only supported for distributed revision control systems. The optional -m parameter allows specifying a commit message. @@ -147,11 +158,21 @@ Use the specified mrconfig file. The default is B<~/.mrconfig> Be verbose. +=item -q + +Be quiet. + =item -s Expand the statistics line displayed at the end to include information about exactly which repositories failed and were skipped, if any. +=item -i + +Interactive mode. If a repository fails to be processed, a subshell will be +started which you can use to resolve or investigate the problem. Exit the +subshell to continue the mr run. + =item -n [number] If no number if specified, just operate on the repository for the current @@ -203,7 +224,9 @@ is an alias, and its value is the action to use. All other sections add repositories. The section header specifies the directory where the repository is located. This is relative to the directory that contains the mrconfig file, but you can also choose to use absolute -paths. +paths. (Note that you can use environment variables in section names; they +will be passed through the shell for expansion. For example, +"[$HOSTNAME]", or "[${HOSTNAME}foo]") Within a section, each parameter defines a shell command to run to handle a given action. mr contains default handlers for "update", "status", @@ -316,7 +339,9 @@ use constant { # configurables my $config_overridden=0; my $verbose=0; +my $quiet=0; my $stats=0; +my $interactive=0; my $max_depth; my $no_chdir=0; my $jobs=1; @@ -400,6 +425,8 @@ sub action { #{{{ $config{$topdir}{$subdir}{lib}."\n" : ""; my $is_checkout=($action eq 'checkout'); + $ENV{MR_REPO}=$dir; + if ($is_checkout) { if (-d $dir) { print "mr $action: $dir already exists, skipping checkout\n" if $verbose; @@ -414,8 +441,6 @@ sub action { #{{{ } } - $ENV{MR_REPO}=$dir; - my $skiptest=findcommand("skip", $dir, $topdir, $subdir, $is_checkout); my $command=findcommand($action, $dir, $topdir, $subdir, $is_checkout); @@ -462,12 +487,12 @@ sub action { #{{{ } else { if (! $no_chdir) { - print "mr $action: $topdir$subdir\n"; + print "mr $action: $topdir$subdir\n" unless $quiet; } else { my $s=$directory; $s=~s/^\Q$topdir$subdir\E\/?//; - print "mr $action: $topdir$subdir (in subdir $s)\n"; + print "mr $action: $topdir$subdir (in subdir $s)\n" unless $quiet; } $command="set -e; ".$lib. "my_action(){ $command\n }; my_action ". @@ -582,6 +607,11 @@ sub record { #{{{ print "\n"; } elsif ($ret == FAILED) { + if ($interactive) { + chdir($dir) unless $no_chdir; + print STDERR "mr: Starting interactive shell. Exit shell to continue.\n"; + system((getpwuid($<))[8]); + } push @failed, $dir; print "\n"; } @@ -605,10 +635,10 @@ sub showstats { #{{{ showstat($#ok+1, "ok", "ok"), showstat($#failed+1, "failed", "failed"), showstat($#skipped+1, "skipped", "skipped"), - ).")\n"; + ).")\n" unless $quiet; if ($stats) { if (@skipped) { - print "mr $action: (skipped: ".join(" ", @skipped).")\n"; + print "mr $action: (skipped: ".join(" ", @skipped).")\n" unless $quiet; } if (@failed) { print STDERR "mr $action: (failed: ".join(" ", @failed).")\n"; @@ -689,6 +719,18 @@ sub selectrepos { #{{{ return @repos; } #}}} +sub expandenv { #{{{ + my $val=shift; + + + if ($val=~/\$/) { + $val=`echo "$val"`; + chomp $val; + } + + return $val; +} #}}} + my %loaded; sub loadconfig { #{{{ my $f=shift; @@ -749,7 +791,7 @@ sub loadconfig { #{{{ chomp; next if /^\s*\#/ || /^\s*$/; if (/^\[([^\]]*)\]\s*$/) { - $section=$1; + $section=expandenv($1); } elsif (/^(\w+)\s*=\s*(.*)/) { my $parameter=$1; @@ -872,7 +914,7 @@ sub modifyconfig { #{{{ $addfields->(); } - $section=$1; + $section=expandenv($1); push @out, $_; } @@ -985,7 +1027,12 @@ sub config { #{{{ } #}}} sub register { #{{{ - if (! $config_overridden) { + if ($config_overridden) { + # 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=~/\/$/; @@ -1054,7 +1101,9 @@ sub getopts { #{{{ "d|directory=s" => sub { $directory=abs_path($_[1]) }, "c|config=s" => sub { $ENV{MR_CONFIG}=$_[1]; $config_overridden=1 }, "v|verbose" => \$verbose, + "q|quiet" => \$quiet, "s|stats" => \$stats, + "i|interactive" => \$interactive, "n|no-recurse:i" => \$max_depth, "j|jobs:i" => \$jobs, ); @@ -1166,7 +1215,7 @@ git_bare_test = test "`GIT_CONFIG="$MR_REPO"/config git config --get core.bare`" = true svn_update = svn update "$@" -git_update = if [ "$@" ]; then git pull "$@"; else git pull -t origin master; fi +git_update = git pull "$@" bzr_update = bzr merge "$@" cvs_update = cvs update "$@" hg_update = hg pull "$@" && hg update "$@" @@ -1177,7 +1226,7 @@ git_status = git status "$@" || true bzr_status = bzr status "$@" cvs_status = cvs status "$@" hg_status = hg status "$@" -darcs_status = darcs whatsnew -ls "$@" +darcs_status = darcs whatsnew -ls "$@" || true svn_commit = svn commit "$@" git_commit = git commit -a "$@" && git push --all @@ -1186,12 +1235,17 @@ cvs_commit = cvs commit "$@" hg_commit = hg commit -m "$@" && hg push darcs_commit = darcs record -a -m "$@" && darcs push -a +git_record = git commit -a "$@" +bzr_record = bzr commit "$@" +hg_record = hg commit -m "$@" +darcs_record = darcs record -a -m "$@" + svn_diff = svn diff "$@" git_diff = git diff "$@" bzr_diff = bzr diff "$@" cvs_diff = cvs diff "$@" hg_diff = hg diff "$@" -darcs_diff = darcs diff "$@" +darcs_diff = darcs diff -u "$@" svn_log = svn log "$@" git_log = git log "$@" @@ -1216,7 +1270,7 @@ git_register = echo "Registering git url: $url in $MR_CONFIG" mr -c "$MR_CONFIG" config "`pwd`" checkout="git clone '$url' '$MR_REPO'" bzr_register = - url=`cat .bzr/branch/parent` + url="`LC_ALL=C bzr info . | egrep -i 'checkout of branch|parent branch' | awk '{print $NF}'`" if [ -z "$url" ]; then error "cannot determine bzr url" fi @@ -1250,7 +1304,10 @@ help = if [ ! -e "$MR_PATH" ]; then error "cannot find program path" fi - (pod2man -c mr "$MR_PATH" | man -l -) || error "pod2man or man failed" + tmp=$(mktemp -t mr.XXXXXXXXXX) || error "mktemp failed" + trap "rm -f $tmp" exit + pod2man -c mr "$MR_PATH" > "$tmp" || error "pod2man failed" + man -l "$tmp" || error "man failed" list = true config =