B<mr> [options] log
+B<mr> [options] register [repository]
+
B<mr> [options] config section [parameter=[value] ...]
B<mr> [options] action [params ...]
List the repositories that mr will act on.
+=item register
+
+Register an existing repository in the mrconfig file. By default, the
+epository in the current directory is registered, or you can specify a
+directory to register.
+
=item config
-Modifies the mrconfig file. The next parameter is the name of the section
-to add or modify, and it is followed by one or more instances of
-"parameter=value". Use "parameter=" to remove a parameter. For example,
-to register a new svn repository in src/foo:
+Adds, modifies, removed, or prints a value from the mrconfig file. The next
+parameter is the name of the section the value is in. To add or modify a
+value, follow it by one or more instances of "parameter=value". Use
+"parameter=" to remove a parameter. Use just "parameter" to get the value
+of a parameter.
+
+For example, to add (or edit) a repository in src/foo:
- mr config src/foo checkout="svn co svn://example.com/foo/trunk"
+ mr config src/foo checkout="svn co svn://example.com/foo/trunk foo"
=item help
"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.
-This is mostly useful if the repositories mr will act on all use the same
-revision control system.
+Additional parameters can be passed to most commands, and are passed on
+unchanged to the underlying revision control system. This is mostly useful
+if the repositories mr will act on all use the same revision control
+system.
=head1 OPTIONS
}
if ($action eq 'help') {
- exec($config{''}{DEFAULT}{help});
+ exec($config{''}{DEFAULT}{$action}) || die "exec: $!";
}
elsif ($action eq 'config') {
if (@ARGV < 2) {
die "mr config: not enough parameters\n";
}
my $section=shift;
- my %fields;
+ if ($section=~/^\//) {
+ # try to convert to a path relative to $config's dir
+ my ($dir)=$config=~/^(.*\/)[^\/]+$/;
+ if ($section=~/^\Q$dir\E(.*)/) {
+ $section=$1;
+ }
+ }
+ my %changefields;
foreach (@ARGV) {
if (/^([^=]+)=(.*)$/) {
- $fields{$1}=$2;
+ $changefields{$1}=$2;
}
else {
- die "mr config: expected parameter=value, not \"$_\"\n";
+ foreach my $topdir (sort keys %config) {
+ if (exists $config{$topdir}{$section} &&
+ exists $config{$topdir}{$section}{$_}) {
+ print $config{$topdir}{$section}{$_}."\n";
+ }
+ }
}
}
- modifyconfig($config, $section, %fields);
+ modifyconfig($config, $section, %changefields) if %changefields;
exit 0;
}
+elsif ($action eq 'register') {
+ my $command="set -e; ".$config{''}{DEFAULT}{lib}."\n".
+ "my_action(){ $config{''}{DEFAULT}{$action}\n }; my_action ".
+ join(" ", map { s/\//\/\//g; s/"/\"/g; '"'.$_.'"' } @ARGV);
+ print STDERR "mr $action: running >>$command<<\n" if $verbose;
+ exec($command) || die "exec: $!";
+}
# work out what repos to act on
my @repos;
if (exists $config{$topdir}{$subdir}{deleted}) {
if (! -d $dir) {
- next;
+ return;
}
else {
my $test="set -e;".$lib.$config{$topdir}{$subdir}{deleted};
$dir="";
}
else {
- # $f might be a symlink
+ if (! -e $f) {
+ return;
+ }
+
my $absf=abs_path($f);
if ($loaded{$absf}) {
return;
my %changefields=@_;
my @lines;
+ my @out;
+
if (-e $f) {
open(my $in, "<", $f) || die "mr: open $f: $!\n";
@lines=<$in>;
close $in;
}
+ my $addfields=sub {
+ my @blanks;
+ while ($out[$#out] =~ /^\s*$/) {
+ unshift @blanks, pop @out;
+ }
+ foreach my $field (sort keys %changefields) {
+ if (length $changefields{$field}) {
+ push @out, "$field = $changefields{$field}\n";
+ }
+ }
+ push @out, @blanks;
+ };
+
my $section;
- my @out;
while (@lines) {
$_=shift(@lines);
elsif (/^\s*\[([^\]]*)\]\s*$/) {
if (defined $section &&
$section eq $targetsection) {
- my @blanks;
- while ($out[$#out] =~ /^\s*$/) {
- unshift @blanks, pop @out;
- }
- foreach my $field (sort keys %changefields) {
- if (length $changefields{$field}) {
- push @out, "$field = $changefields{$field}\n";
- }
- }
- push @out, @blanks;
+ $addfields->();
}
$section=$1;
}
}
- if (%changefields) {
+ if (defined $section &&
+ $section eq $targetsection) {
+ $addfields->();
+ }
+ elsif (%changefields) {
push @out, "\n[$targetsection]\n";
foreach my $field (sort keys %changefields) {
if (length $changefields{$field}) {
else \
error "unknown repo type" \
fi
+register = \
+ if [ -n "$1" ]; then \
+ cd "$1" \
+ fi \
+ basedir="$(basename $(pwd))" \
+ if [ -d .svn ]; then \
+ 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" \
+ mr config "$(pwd)" checkout="svn co $url $basedir" \
+ elif [ -d .git ]; then \
+ url=$(LANG=C git-config --get remote.origin.url) \
+ if [ -z "$url" ]; then \
+ error "cannot determine git url" \
+ fi \
+ echo "Registering git url: $url" \
+ mr config "$(pwd)" checkout="git clone $url $basedir" \
+ elif [ -d .bzr ]; then \
+ url=$(cat .bzr/branch/parent) \
+ if [ -z "$url" ]; then \
+ error "cannot determine bzr url" \
+ fi \
+ echo "Registering bzr url: $url" \
+ mr config "$(pwd)" checkout="bzr clone $url $basedir" \
+ else \
+ error "unable to register this repo type" \
+ fi
list = true
config =
help = \