X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/7634c277a5d0fedfbeb314d79e6974fb16460472..f369b8af542c644eed69bd3bf26d77dfc177c33e:/mr?ds=sidebyside diff --git a/mr b/mr index 00d0e1c..175c5f1 100755 --- a/mr +++ b/mr @@ -16,6 +16,8 @@ B [options] commit [-m "message"] B [options] diff +B [options] log + B [options] action [params ...] =head1 DESCRIPTION @@ -28,6 +30,11 @@ respository. Any mix of revision control systems can be used with B, and you can define arbitrary actions for commands like "update", "checkout", or "commit". +B cds into and operates on all registered repsitories at or below your +working directory. Or, if you are in a subdirectory of a repository that +contains no other registered repositories, it will stay in that directory, +and work on only that repository, + The predefined commands should be fairly familiar to users of any revision control system: @@ -59,7 +66,11 @@ The optional -m parameter allows specifying a commit message. Show a diff of uncommitted changes. -=item list +=item log + +Show the commit log. + +=item list (or ls) List the repositories that mr will act on. @@ -70,11 +81,8 @@ Displays this help. =back Actions can be abbreviated to any unambiguous subsctring, so -"mr st" is equivilant to "mr status". - -B operates on all registered repsitories at or below your working -directory. Or, if you are in a subdirectory of a repository, it will act on -only that repository. +"mr st" is equivilant to "mr status", and "mr up" is equivilant to "mr +update" Additional parameters can be passed to other commands than "commit", they will be passed on unchanged to the underlying revision control system. @@ -92,7 +100,7 @@ the current working directory. =item -c mrconfig -Use the specified mrconfig file, instead of looking for on in your home +Use the specified mrconfig file, instead of looking for one in your home directory. =item -v @@ -217,8 +225,13 @@ if (! exists $knownactions{$action}) { if (@matches == 1) { $action=$matches[0]; } + elsif (@matches == 0) { + die "mr: unknown action \"$action\" (known actions: ". + join(", ", sort keys %knownactions).")\n"; + } else { - die "mr: ambiguous action \"$action\" (matches @matches)\n"; + die "mr: ambiguous action \"$action\" (matches: ". + join(", ", @matches).")\n"; } } } @@ -227,36 +240,38 @@ if ($action eq 'help') { exec($config{''}{default}{help}); } -# handle being in a subdir of a repository +# work out what repos to act on +my @repos; my $nochdir=0; foreach my $topdir (sort keys %config) { - foreach my $subdir (reverse sort keys %{$config{$topdir}}) { + foreach my $subdir (sort keys %{$config{$topdir}}) { next if $subdir eq 'default'; - my $d=$directory."/"; my $dir=$topdir.$subdir; - $dir.="/" unless $dir=~/\/$/; - if ($d =~ /^\Q$dir\E/) { - $directory=$topdir.$subdir; - $nochdir=1; - last; + next if $dir ne $directory && $dir !~ /^\Q$directory\E\//; + push @repos, [$dir, $topdir, $subdir]; + } +} +if (! @repos) { + # fallback to find a leaf repo + LEAF: foreach my $topdir (reverse sort keys %config) { + foreach my $subdir (reverse sort keys %{$config{$topdir}}) { + next if $subdir eq 'default'; + my $dir=$topdir.$subdir; + my $d=$directory; + $dir.="/" unless $dir=~/\/$/; + $d.="/" unless $d=~/\/$/; + if ($d=~/^\Q$dir\E/) { + push @repos, [$dir, $topdir, $subdir]; + last LEAF; + } } } + $nochdir=1; } my (@failed, @successful, @skipped); -foreach my $topdir (sort keys %config) { - foreach my $subdir (sort keys %{$config{$topdir}}) { - - my $dir=$topdir.$subdir; - - if (defined $directory && - $dir ne $directory && - $dir !~ /^\Q$directory\E\//) { - next; - } - - action($action, $dir, $topdir, $subdir); - } +foreach my $repo (@repos) { + action($action, @$repo); } sub action { @@ -299,7 +314,12 @@ sub action { push @skipped, $dir; } else { - print "mr $action: $dir\n"; + if (! $nochdir) { + print "mr $action: $dir\n"; + } + else { + print "mr $action: $dir (in subdir $directory)\n"; + } my $command="set -e; ".$lib. "my_action(){ $config{$topdir}{$subdir}{$action} ; }; my_action ". join(" ", map { s/\//\/\//g; s/"/\"/g; '"'.$_.'"' } @ARGV); @@ -446,6 +466,7 @@ __DATA__ [alias] co = checkout ci = commit + ls = list [default] lib = \ error() { \ @@ -484,6 +505,14 @@ diff = \ else \ error "unknown repo type"; \ fi +log = \ + if [ -d "$MR_REPO"/.svn ]; then \ + svn log"$@"; \ + elif [ -d "$MR_REPO"/.git ]; then \ + git log "$@"; \ + else \ + error "unknown repo type"; \ + fi list = true help = \ if [ ! -e "$MR_PATH" ]; then \