X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/cab31c75dc608d3567c07c616c2cd84f7be2ce3e..54b2aa669527829d36eeb92dbda13977200d5545:/mr?ds=inline diff --git a/mr b/mr index 235c175..db209d2 100755 --- a/mr +++ b/mr @@ -18,6 +18,8 @@ B [options] diff B [options] log +B [options] register [repository] + B [options] config section [parameter=[value] ...] B [options] action [params ...] @@ -76,14 +78,23 @@ Show the commit log. 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 @@ -95,10 +106,10 @@ Actions can be abbreviated to any unambiguous subsctring, so "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 @@ -259,25 +270,44 @@ if (! exists $knownactions{$action}) { } 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; @@ -324,7 +354,7 @@ sub action { if (exists $config{$topdir}{$subdir}{deleted}) { if (! -d $dir) { - next; + return; } else { my $test="set -e;".$lib.$config{$topdir}{$subdir}{deleted}; @@ -441,7 +471,10 @@ sub loadconfig { $dir=""; } else { - # $f might be a symlink + if (! -e $f) { + return; + } + my $absf=abs_path($f); if ($loaded{$absf}) { return; @@ -530,14 +563,28 @@ sub modifyconfig { 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); @@ -547,16 +594,7 @@ sub modifyconfig { 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; @@ -586,7 +624,11 @@ sub modifyconfig { } } - 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}) { @@ -675,6 +717,36 @@ log = \ 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 = \