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
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",
my $verbose=0;
my $quiet=0;
my $stats=0;
+my $interactive=0;
my $max_depth;
my $no_chdir=0;
my $jobs=1;
$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;
}
}
- $ENV{MR_REPO}=$dir;
-
my $skiptest=findcommand("skip", $dir, $topdir, $subdir, $is_checkout);
my $command=findcommand($action, $dir, $topdir, $subdir, $is_checkout);
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";
}
return @repos;
} #}}}
+sub expandenv { #{{{
+ my $val=shift;
+
+
+ if ($val=~/\$/) {
+ $val=`echo "$val"`;
+ chomp $val;
+ }
+
+ return $val;
+} #}}}
+
my %loaded;
sub loadconfig { #{{{
my $f=shift;
chomp;
next if /^\s*\#/ || /^\s*$/;
if (/^\[([^\]]*)\]\s*$/) {
- $section=$1;
+ $section=expandenv($1);
}
elsif (/^(\w+)\s*=\s*(.*)/) {
my $parameter=$1;
$addfields->();
}
- $section=$1;
+ $section=expandenv($1);
push @out, $_;
}
} #}}}
sub register { #{{{
- if (! $config_overridden) {
+ if ($config_overridden) {
+ ($directory)=$ENV{MR_CONFIG}=~/^(.*\/)[^\/]+$/;
+ } else {
# Find the closest known mrconfig file to the current
# directory.
$directory.="/" unless $directory=~/\/$/;
"v|verbose" => \$verbose,
"q|quiet" => \$quiet,
"s|stats" => \$stats,
+ "i|interactive" => \$interactive,
"n|no-recurse:i" => \$max_depth,
"j|jobs:i" => \$jobs,
);
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
- fi
+git_update = git pull "$@"
bzr_update = bzr merge "$@"
cvs_update = cvs update "$@"
hg_update = hg pull "$@" && hg update "$@"
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
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