X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/397a70209cc535de92f9565c9da25051e065e3e0..157203e8c58b608b328d55ba8dcbcfe791c847f5:/mr?ds=inline diff --git a/mr b/mr index 29001e0..a4469e9 100755 --- a/mr +++ b/mr @@ -152,10 +152,14 @@ Be verbose. Expand the statistics line displayed at the end to include information about exactly which repositories failed and were skipped, if any. -=item -n +=item -n [number] -Just operate on the repository for the current directory, do not -recurse into deeper repositories. +If no number if specified, just operate on the repository for the current +directory, do not recurse into deeper repositories. + +If a number is specified, will recurse into repositories at most that many +subdirectories deep. For example, with -n 2 it would recurse into ./src/foo, +but not ./src/packages/bar. =item -j number @@ -232,7 +236,7 @@ mr is run by joey. The second uses the hours_since function (included in mr's built-in library) to skip updating the repo unless it's been at least 12 hours since the last update. - skip = test $(whoami) != joey + skip = test `whoami` != joey skip = [ "$1" = update ] && ! hours_since "$1" 12 =item order @@ -309,10 +313,11 @@ use constant { my $config_overridden=0; my $verbose=0; my $stats=0; -my $no_recurse=0; +my $max_depth; my $no_chdir=0; my $jobs=1; my $directory=getcwd(); +$ENV{MR_CONFIG}="$ENV{HOME}/.mrconfig"; # globals :-( my %config; @@ -323,9 +328,14 @@ my (@ok, @failed, @skipped); main(); +my %rcs; sub rcs_test { #{{{ my ($action, $dir, $topdir, $subdir) = @_; + if (exists $rcs{$dir}) { + return $rcs{$dir}; + } + my $test="set -e\n"; foreach my $rcs_test ( sort { @@ -349,10 +359,10 @@ sub rcs_test { #{{{ return undef; } if (! length $rcs) { - return undef; + return $rcs{$dir}=undef; } else { - return $rcs; + return $rcs{$dir}=$rcs; } } #}}} @@ -442,7 +452,7 @@ sub action { #{{{ return FAILED; } else { - print STDERR "mr $action: no defined $action command for $rcs repository $topdir$subdir, skipping\n"; + print STDERR "mr $action: no defined action for $rcs repository $topdir$subdir, skipping\n"; return SKIPPED; } } @@ -645,8 +655,13 @@ sub selectrepos { #{{{ my $d=$directory; $dir.="/" unless $dir=~/\/$/; $d.="/" unless $d=~/\/$/; - next if $no_recurse && $d ne $dir; next if $dir ne $d && $dir !~ /^\Q$d\E/; + if (defined $max_depth) { + my @a=split('/', $dir); + my @b=split('/', $d); + do { } while (@a && @b && shift(@a) eq shift(@b)); + next if @a > $max_depth || @b > $max_depth; + } push @repos, [$dir, $topdir, $subdir]; } if (! @repos) { @@ -1036,7 +1051,7 @@ sub getopts { #{{{ "c|config=s" => sub { $ENV{MR_CONFIG}=$_[1]; $config_overridden=1 }, "v|verbose" => \$verbose, "s|stats" => \$stats, - "n|no-recurse" => \$no_recurse, + "n|no-recurse:i" => \$max_depth, "j|jobs=i" => \$jobs, ); if (! $result || @ARGV < 1) { @@ -1051,8 +1066,6 @@ sub init { #{{{ exit 2; }; - $ENV{MR_CONFIG}="$ENV{HOME}/.mrconfig"; - # This can happen if it's run in a directory that was removed # or other strangeness. if (! defined $directory) { @@ -1128,7 +1141,7 @@ lib = if [ -z "$flagfile" ]; then error "cannot determine flag filename" fi - delta=$(perl -wle 'print -f shift() ? int((-M _) * 24) : 9999' "$flagfile") + delta=`perl -wle 'print -f shift() ? int((-M _) * 24) : 9999' "$flagfile"` if [ "$delta" -lt "$2" ]; then exit 0 else @@ -1146,7 +1159,7 @@ darcs_test = test -d "$MR_REPO"/_darcs git_bare_test = test -d "$MR_REPO"/refs/heads && test -d "$MR_REPO"/refs/tags && test -d "$MR_REPO"/objects && test -f "$MR_REPO"/config && - test "$(GIT_CONFIG="$MR_REPO"/config git config --get core.bare)" = true + 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 @@ -1185,44 +1198,44 @@ darcs_log = darcs changes "$@" git_bare_log = git log "$@" svn_register = - url=$(LANG=C svn info . | grep -i ^URL: | cut -d ' ' -f 2) + url=`LANG=C svn info . | grep -i '^URL:' | cut -d ' ' -f 2` if [ -z "$url" ]; then error "cannot determine svn url" fi echo "Registering svn url: $url in $MR_CONFIG" mr -c "$MR_CONFIG" config "`pwd`" checkout="svn co '$url' '$MR_REPO'" git_register = - url="$(LANG=C git config --get remote.origin.url)" || true + url="`LANG=C git config --get remote.origin.url`" || true if [ -z "$url" ]; then error "cannot determine git url" fi 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=`cat .bzr/branch/parent` if [ -z "$url" ]; then error "cannot determine bzr url" fi echo "Registering bzr url: $url in $MR_CONFIG" mr -c "$MR_CONFIG" config "`pwd`" checkout="bzr clone '$url' '$MR_REPO'" cvs_register = - repo=$(cat CVS/Repository) - root=$(cat CVS/Root) + repo=`cat CVS/Repository` + root=`cat CVS/Root` if [ -z "$root" ]; then error "cannot determine cvs root" fi echo "Registering cvs repository $repo at root $root" mr -c "$MR_CONFIG" config "`pwd`" checkout="cvs -d '$root' co -d '$MR_REPO' '$repo'" hg_register = - url=$(hg showconfig paths.default) + url=`hg showconfig paths.default` echo "Registering mercurial repo url: $url in $MR_CONFIG" mr -c "$MR_CONFIG" config "`pwd`" checkout="hg clone '$url' '$MR_REPO'" darcs_register = - url=$(cat _darcs/prefs/defaultrepo) + url=`cat _darcs/prefs/defaultrepo` echo "Registering darcs repository $url in $MR_CONFIG" mr -c "$MR_CONFIG" config "`pwd`" checkout="darcs get '$url'p '$MR_REPO'" git_bare_register = - url="$(LANG=C GIT_CONFIG=config git config --get remote.origin.url)" || true + url="`LANG=C GIT_CONFIG=config git config --get remote.origin.url`" || true if [ -z "$url" ]; then error "cannot determine git url" fi