X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/9d693e74ae191dd8ba452ee5319c5cf6a59e1e9a..855ff6e3794ed4ac64de9f8752b89440e8057f07:/mr diff --git a/mr b/mr index 66b88ff..ba29b40 100755 --- a/mr +++ b/mr @@ -152,16 +152,24 @@ 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. -=item -j number +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. -Run the specified number of jobs in parallel. This can greatly speed up -operations such as updates. It is not recommended for interactive -operations. +=item -j [number] + +Run the specified number of jobs in parallel, or an unlimited number of jobs +with no number specified. This can greatly speed up operations such as updates. +It is not recommended for interactive operations. + +Note that running more than 10 jobs at a time is likely to run afoul of +ssh connection limits. Running between 3 and 5 jobs at a time will yeild +a good speedup in updates without loading the machine too much. =back @@ -309,7 +317,7 @@ 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(); @@ -324,9 +332,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 { @@ -350,10 +363,10 @@ sub rcs_test { #{{{ return undef; } if (! length $rcs) { - return undef; + return $rcs{$dir}=undef; } else { - return $rcs; + return $rcs{$dir}=$rcs; } } #}}} @@ -443,7 +456,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; } } @@ -501,7 +514,7 @@ sub mrs { #{{{ my @out; my $running=0; while (@fhs or @repos) { - while ($running < $jobs && @repos) { + while ((!$jobs || $running < $jobs) && @repos) { $running++; my $repo = shift @repos; pipe(my $outfh, CHILD_STDOUT); @@ -646,8 +659,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) { @@ -914,7 +932,7 @@ sub dispatch { #{{{ register(@ARGV); } - if ($jobs > 1) { + if (!$jobs || $jobs > 1) { mrs($action, selectrepos()); } else { @@ -1037,8 +1055,8 @@ sub getopts { #{{{ "c|config=s" => sub { $ENV{MR_CONFIG}=$_[1]; $config_overridden=1 }, "v|verbose" => \$verbose, "s|stats" => \$stats, - "n|no-recurse" => \$no_recurse, - "j|jobs=i" => \$jobs, + "n|no-recurse:i" => \$max_depth, + "j|jobs:i" => \$jobs, ); if (! $result || @ARGV < 1) { die("Usage: mr [-d directory] action [params ...]\n". @@ -1166,7 +1184,7 @@ git_commit = git commit -a "$@" && git push --all bzr_commit = bzr commit "$@" && bzr push cvs_commit = cvs commit "$@" hg_commit = hg commit -m "$@" && hg push -darcs_commit = darcs commit -a -m "$@" && darcs push -a +darcs_commit = darcs record -a -m "$@" && darcs push -a svn_diff = svn diff "$@" git_diff = git diff "$@" @@ -1184,14 +1202,14 @@ darcs_log = darcs changes "$@" git_bare_log = git log "$@" svn_register = - url=`LANG=C svn info . | grep -i '^URL:' | cut -d ' ' -f 2` + url=`LC_ALL=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="`LC_ALL=C git config --get remote.origin.url`" || true if [ -z "$url" ]; then error "cannot determine git url" fi @@ -1219,9 +1237,9 @@ hg_register = darcs_register = 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'" + mr -c "$MR_CONFIG" config "`pwd`" checkout="darcs get '$url' '$MR_REPO'" git_bare_register = - url="`LANG=C GIT_CONFIG=config git config --get remote.origin.url`" || true + url="`LC_ALL=C GIT_CONFIG=config git config --get remote.origin.url`" || true if [ -z "$url" ]; then error "cannot determine git url" fi