From 681a17143709b01f67a2d91b099247fba1a9626e Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 12 Oct 2007 19:14:17 -0400 Subject: [PATCH] implemented mr register --- TODO | 16 ---------------- mr | 53 +++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/TODO b/TODO index 000d5ab..fe35506 100644 --- a/TODO +++ b/TODO @@ -11,19 +11,3 @@ renamedfrom = src/foo/bar (Support multple renames of a single repo?) - -* mr register - - Idea is you check out a repo and then use mr register to add it to the - closest mrconfig file. - - mr register would be implemented as a shell command that then calls - mr config with flags that make it edit the mrconfig file: - - if [ -d "$MR_REPO/.svn" ]; then - url=$(svn info "$MR_REPO" | grep -i ^URL: | cut -d ' ' -f 2) - if [ -z "$url" ]; then - error "cannot determine svn url" - fi - mr -c "$MR_CONFIG" config --add "$MR_REPO" --checkout="svn co $URL" - fi diff --git a/mr b/mr index 235c175..c6d74e9 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,12 +78,18 @@ Show the commit log. List the repositories that mr will act on. +=item register + +The next parameter is the directory of an existing repository. The +repository will be registered in the mrconfig file. + =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: +"parameter=value". Use "parameter=" to remove a parameter. + +For example, to register a new svn repository in src/foo: mr config src/foo checkout="svn co svn://example.com/foo/trunk" @@ -259,13 +267,20 @@ 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; + if ($section=~/^\//) { + # try to convert to a path relative to $config's dir + my ($dir)=$config=~/^(.*\/)[^\/]+$/; + if ($section=~/^\Q$dir\E(.*)/) { + $section=$1; + } + } my %fields; foreach (@ARGV) { if (/^([^=]+)=(.*)$/) { @@ -278,6 +293,13 @@ elsif ($action eq 'config') { modifyconfig($config, $section, %fields); 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; @@ -441,7 +463,6 @@ sub loadconfig { $dir=""; } else { - # $f might be a symlink my $absf=abs_path($f); if ($loaded{$absf}) { return; @@ -675,6 +696,30 @@ log = \ else \ error "unknown repo type" \ fi +register = \ + if [ -z "$1" ]; then \ + error "repository directory not specified" \ + fi \ + cd "$1" \ + basedir="$(basename $(pwd))" \ + if [ -d .svn ]; then \ + url=$(svn info . | \ + grep -i ^URL: | cut -d ' ' -f 2) \ + if [ -z "$url" ]; then \ + error "cannot determine svn url" \ + fi \ + echo "Found svn url: $url" \ + mr config "$(pwd)" checkout="svn co $url $basedir" \ + elif [ -d .git ]; then \ + url=$(git-config --get remote.origin.url) \ + if [ -z "$url" ]; then \ + error "cannot determine git url" \ + fi \ + echo "Found git url: $url" \ + mr config "$(pwd)" checkout="git clone $url $basedir" \ + else \ + error "unable to register this repo type" \ + fi list = true config = help = \ -- 2.39.5