]> git.madduck.net Git - code/myrepos.git/commitdiff

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

mr bootstrap enhancements for d-i
authorJoey Hess <joey@gnu.kitenet.net>
Wed, 9 Sep 2009 00:20:25 +0000 (20:20 -0400)
committerJoey Hess <joey@gnu.kitenet.net>
Wed, 9 Sep 2009 00:20:25 +0000 (20:20 -0400)
* mr bootstrap: Allow a directory to checkout into to be specified,
  and create it if necessary.
* mr bootstrap: If the mrconfig file contains a repository named ".",
  check it out into the top level of the directory bootstrapped.

debian/changelog
mr

index 437f1e2c13d1efff370390e353cc6ba8a4f741eb..fd177c56c5006277b46c25f5ad7f0a71f1b7b7c4 100644 (file)
@@ -3,6 +3,10 @@ mr (0.43) UNRELEASED; urgency=low
   * Set User-Agent to "mr" when downloading the mrconfig file
     with mr bootstrap. Closes: #541778
   * Man page typo. Closes: #545412
   * Set User-Agent to "mr" when downloading the mrconfig file
     with mr bootstrap. Closes: #541778
   * Man page typo. Closes: #545412
+  * mr bootstrap: Allow a directory to checkout into to be specified,
+    and create it if necessary.
+  * mr bootstrap: If the mrconfig file contains a repository named ".",
+    check it out into the top level of the directory bootstrapped.
 
  -- Joey Hess <joeyh@debian.org>  Sun, 16 Aug 2009 11:36:03 -0400
 
 
  -- Joey Hess <joeyh@debian.org>  Sun, 16 Aug 2009 11:36:03 -0400
 
diff --git a/mr b/mr
index 91eb151c909f5318f7de4f1464e9dca99ff5e95c..8de26f832aaaba70d8a6085ebdcd6a8b96211e8d 100755 (executable)
--- a/mr
+++ b/mr
@@ -20,7 +20,7 @@ B<mr> [options] diff
 
 B<mr> [options] log
 
 
 B<mr> [options] log
 
-B<mr> [options] bootstrap url
+B<mr> [options] bootstrap url [directory]
 
 B<mr> [options] register [repository]
 
 
 B<mr> [options] register [repository]
 
@@ -104,10 +104,16 @@ These commands are also available:
 
 =over 4
 
 
 =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)
 
 
 =item list (or ls)
 
@@ -505,7 +511,7 @@ sub findcommand {
 }
 
 sub action {
 }
 
 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} ?
        
        $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) {
        $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) {
        }
        elsif ($action =~ /update/) {
                if (! -d $dir) {
@@ -939,11 +947,11 @@ sub is_trusted_checkout {
 my %loaded;
 sub loadconfig {
        my $f=shift;
 my %loaded;
 sub loadconfig {
        my $f=shift;
+       my $dir=shift;
 
        my @toload;
 
        my $in;
 
        my @toload;
 
        my $in;
-       my $dir;
        my $trusted;
        if (ref $f eq 'GLOB') {
                $dir="";
        my $trusted;
        if (ref $f eq 'GLOB') {
                $dir="";
@@ -963,10 +971,13 @@ sub loadconfig {
 
                $trusted=is_trusted_config($absf);
 
 
                $trusted=is_trusted_config($absf);
 
-               ($dir)=$f=~/^(.*\/)[^\/]+$/;
                if (! defined $dir) {
                if (! defined $dir) {
-                       $dir=".";
+                       ($dir)=$f=~/^(.*\/)[^\/]+$/;
+                       if (! defined $dir) {
+                               $dir=".";
+                       }
                }
                }
+
                $dir=abs_path($dir)."/";
                
                if (! exists $configfiles{$dir}) {
                $dir=abs_path($dir)."/";
                
                if (! exists $configfiles{$dir}) {
@@ -1315,17 +1326,38 @@ sub register {
 
 sub bootstrap {
        my $url=shift @ARGV;
 
 sub bootstrap {
        my $url=shift @ARGV;
-
+       my $dir=shift @ARGV || ".";
+       
        if (! defined $url || ! length $url) {
                die "mr: bootstrap requires url\n";
        }
        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");
        }
 
        exec("mr $ENV{MR_SWITCHES} -c .mrconfig checkout");