X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/06180cb797cbacf3be3fe8ae3165aefbbc3ab18e..6e115274b615e698a8673ffded63895cf5089b41:/mr?ds=sidebyside diff --git a/mr b/mr index f9c4bf0..0a78df5 100755 --- a/mr +++ b/mr @@ -20,7 +20,7 @@ B [options] diff B [options] log -B [options] bootstrap url +B [options] bootstrap url [directory] B [options] register [repository] @@ -36,7 +36,7 @@ B [options] remember action [params ...] B is a Multiple Repository management tool. It can checkout, update, or perform other actions on a set of repositories as if they were one combined -repository. It supports any combination of subversion, git, cvs, mecurial, +repository. It supports any combination of subversion, git, cvs, mercurial, bzr and darcs repositories, and support for other revision control systems can easily be added. @@ -104,10 +104,16 @@ These commands are also available: =over 4 -=item bootstrap url +=item bootstrap url [directory] -Causes mr to download the url, save it to a .mrconfig file in the -current directory, and then check out all repositories listed in it. +Causes mr to download the url, and use it as a .mrconfig file +to checkout the repositories listed in it, into the specified directory. + +The directory will be created if it does not exist. If no directory is +specified, the current directory will be used. + +If the .mrconfig file includes a repository named ".", that +is checked out into the top of the specified directory. =item list (or ls) @@ -505,7 +511,7 @@ sub findcommand { } sub action { - my ($action, $dir, $topdir, $subdir) = @_; + my ($action, $dir, $topdir, $subdir, $force_checkout) = @_; $ENV{MR_CONFIG}=$configfiles{$topdir}; my $lib=exists $config{$topdir}{$subdir}{lib} ? @@ -515,12 +521,14 @@ sub action { $ENV{MR_REPO}=$dir; if ($is_checkout) { - if (-d $dir) { - print "mr $action: $dir already exists, skipping checkout\n" if $verbose; - return SKIPPED; + if (! $force_checkout) { + if (-d $dir) { + print "mr $action: $dir already exists, skipping checkout\n" if $verbose; + return SKIPPED; + } + + $dir=~s/^(.*)\/[^\/]+\/?$/$1/; } - - $dir=~s/^(.*)\/[^\/]+\/?$/$1/; } elsif ($action =~ /update/) { if (! -d $dir) { @@ -705,7 +713,7 @@ sub record { if ($interactive) { chdir($dir) unless $no_chdir; print STDERR "mr: Starting interactive shell. Exit shell to continue.\n"; - system((getpwuid($<))[8]); + system((getpwuid($<))[8], "-i"); } push @failed, $dir; print "\n"; @@ -939,11 +947,11 @@ sub is_trusted_checkout { my %loaded; sub loadconfig { my $f=shift; + my $dir=shift; my @toload; my $in; - my $dir; my $trusted; if (ref $f eq 'GLOB') { $dir=""; @@ -963,10 +971,13 @@ sub loadconfig { $trusted=is_trusted_config($absf); - ($dir)=$f=~/^(.*\/)[^\/]+$/; if (! defined $dir) { - $dir="."; + ($dir)=$f=~/^(.*\/)[^\/]+$/; + if (! defined $dir) { + $dir="."; + } } + $dir=abs_path($dir)."/"; if (! exists $configfiles{$dir}) { @@ -1315,17 +1326,38 @@ sub register { sub bootstrap { my $url=shift @ARGV; - + my $dir=shift @ARGV || "."; + if (! defined $url || ! length $url) { die "mr: bootstrap requires url\n"; } + + # Download the config file to a temporary location. + eval q{use File::Temp}; + die $@ if $@; + my $tmpconfig=File::Temp->new(); + if (system("curl", "-A", "mr", "-s", $url, "-o", $tmpconfig) != 0) { + die "mr: download of $url failed\n"; + } - if (-e ".mrconfig") { - die "mr: .mrconfig file already exists, not overwriting with $url\n"; + if (! -e $dir) { + system("mkdir", "-p", $dir); } + chdir($dir) || die "chdir $dir: $!"; - if (system("curl", "-A", "mr", "-s", $url, "-o", ".mrconfig") != 0) { - die "mr: download of $url failed\n"; + # Special case to handle checkout of the "." repo, which + # would normally be skipped. + my $topdir=abs_path(".")."/"; + my @repo=($topdir, $topdir, "."); + loadconfig($tmpconfig, $topdir); + record(\@repo, action("checkout", @repo, 1)) + if exists $config{$topdir}{"."}{"checkout"}; + + if (-e ".mrconfig") { + print STDERR "mr: .mrconfig file already exists, not overwriting with $url\n"; + } + else { + rename($tmpconfig, ".mrconfig") || die "rename: $!"; } exec("mr $ENV{MR_SWITCHES} -c .mrconfig checkout"); @@ -1597,14 +1629,26 @@ hg_trusted_checkout = hg clone $url $repo darcs_trusted_checkout = darcs get $url $repo git_bare_trusted_checkout = git clone --bare $url $repo + help = + case `uname -s` in + SunOS) + SHOWMANFILE="/usr/bin/man -f" + ;; + Darwin) + SHOWMANFILE="/usr/bin/man" + ;; + *) + SHOWMANFILE="/usr/bin/man -l" + ;; + esac if [ ! -e "$MR_PATH" ]; then error "cannot find program path" fi tmp=$(mktemp -t mr.XXXXXXXXXX) || error "mktemp failed" trap "rm -f $tmp" exit pod2man -c mr "$MR_PATH" > "$tmp" || error "pod2man failed" - man -l "$tmp" || error "man failed" + $SHOWMANFILE "$tmp" || error "man failed" list = true config = bootstrap =