mr - a Multiple Repository management tool
=head1 SYNOPSIS
-
+/
B<mr> [options] checkout
B<mr> [options] update
B<mr> [options] action [params ...]
+B<mr> [options] [online|offline]
+
+B<mr> [options] remember action [params ...]
+
=head1 DESCRIPTION
B<mr> is a Multiple Repository management tool. It can checkout, update, or
The ~/.mrconfig file is used by default. To use a different config file,
use the -c option.
+=item offline
+
+Advises mr that it is in offline mode. Any commands that fail in
+offline mode will be remembered, and retried when mr is told it's online.
+
+=item online
+
+Advices mr that it is in online mode again. Commands that failed while in
+offline mode will be re-run.
+
+=item remember
+
+Remember a command, to be run later when mr re-enters online mode. This
+implicitly puts mr into offline mode. The command can be any regular mr
+command. This is useful when you know that a command will fail due to being
+offline, and so don't want to run it right now at all, but just remember
+to run it when you go back online.
+
=item help
Displays this help.
=head1 FILES
+The ~/.mrlog file contains commands that mr has remembered to run later,
+due to being offline. You can delete or edit this file to remove commands,
+or even to add other commands for 'mr online' to run. If the file is
+present, mr assumes it is in offline mode.
+
B<mr> is configured by .mrconfig files. It starts by reading the .mrconfig
file in your home directory, and this can in turn chain load .mrconfig files
from repositories.
my %knownactions;
my %alias;
my (@ok, @failed, @skipped);
+my @switches=@ARGV;
main();
$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 STDERR "mr $action: failed ($ret)\n" if $verbose;
if ($ret >> 8 != 0) {
print STDERR "mr $action: command failed\n";
+ if (-e "$ENV{HOME}/.mrlog" && $action ne 'remember') {
+ @ARGV=(@switches, $action, @ARGV);
+ action("remember", $dir, $topdir, $subdir);
+ }
}
elsif ($ret != 0) {
print STDERR "mr $action: command died ($ret)\n";
elsif ($action eq 'register') {
register(@ARGV);
}
+ elsif ($action eq 'remember') {
+ my @repos=selectrepos;
+ action($action, @{$repos[0]}) if @repos;
+ exit 0;
+ }
if (!$jobs || $jobs > 1) {
mrs($action, selectrepos());
sub help { #{{{
exec($config{''}{DEFAULT}{help}) || die "exec: $!";
} #}}}
-
+
sub config { #{{{
if (@_ < 2) {
die "mr config: not enough parameters\n";
} #}}}
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=~/\/$/;
sub main { #{{{
getopts();
init();
+
loadconfig(\*DATA);
loadconfig($ENV{MR_CONFIG});
#use Data::Dumper; print Dumper(\%config);
+
+ my $action=shift @ARGV;
+ @switches = grep { $_ ne $action } @SWITCHES;
+ $action=expandaction($action);
- my $action=expandaction(shift @ARGV);
dispatch($action);
showstats($action);
list = true
config =
+online =
+ if [ -e ~/.mrlog ]; then
+ info "running offline commands"
+ mv -f ~/.mrlog ~/.mrlog.old
+ if ! sh ~/.mrlog.old; then
+ error "offline commands failed; left in ~/.mrlog.old"
+ fi
+ rm -f ~/.mrlog.old
+ else
+ info "no offline commands to run"
+ fi
+offline =
+ touch ~/.mrlog
+ info "offline mode enabled"
+remember =
+ info "remembering command: 'mr $@'"
+ command="mr -d '$(pwd)'"
+ for w in "$@"; do
+ command="$command '$w'"
+ done
+ if [ ! -e ~/.mrlog ] || ! grep -q -F "$command" ~/.mrlog; then
+ echo "$command" >> ~/.mrlog
+ fi
+
ed = echo "A horse is a horse, of course, of course.."
T = echo "I pity the fool."
right = echo "Not found."