]> git.madduck.net Git - code/myrepos.git/blobdiff - mr

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:

releasing version 0.41
[code/myrepos.git] / mr
diff --git a/mr b/mr
index a897a5fdde3f3d87158bd05d962d72ac79c131a2..fd380dbe80b2657260caae2e840f8ca9a2b42b58 100755 (executable)
--- a/mr
+++ b/mr
@@ -20,6 +20,8 @@ B<mr> [options] diff
 
 B<mr> [options] log
 
 
 B<mr> [options] log
 
+B<mr> [options] bootstrap url
+
 B<mr> [options] register [repository]
 
 B<mr> [options] config section ["parameter=[value]" ...]
 B<mr> [options] register [repository]
 
 B<mr> [options] config section ["parameter=[value]" ...]
@@ -98,6 +100,14 @@ These commands are also available:
 
 =over 4
 
 
 =over 4
 
+=item bootstrap url
+
+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.
+
+(Please only do this if you have reason to trust the url, since
+mrconfig files can contain arbitrary commands!)
+
 =item list (or ls)
 
 List the repositories that mr will act on.
 =item list (or ls)
 
 List the repositories that mr will act on.
@@ -179,6 +189,11 @@ the current working directory.
 
 Use the specified mrconfig file. The default is B<~/.mrconfig>
 
 
 Use the specified mrconfig file. The default is B<~/.mrconfig>
 
+=item -p
+
+Search in the current directory, and its parent directories and use
+the first B<.mrconfig> found, instead of the default B<~/.mrconfig>.
+
 =item -v
 
 Be verbose.
 =item -v
 
 Be verbose.
@@ -349,7 +364,7 @@ the documentation in the files for details about using them.
 
 =head1 AUTHOR
 
 
 =head1 AUTHOR
 
-Copyright 2007 Joey Hess <joey@kitenet.net>
+Copyright 2007-2009 Joey Hess <joey@kitenet.net>
 
 Licensed under the GNU GPL version 2 or higher.
 
 
 Licensed under the GNU GPL version 2 or higher.
 
@@ -1018,6 +1033,9 @@ sub dispatch {
        elsif ($action eq 'register') {
                register(@ARGV);
        }
        elsif ($action eq 'register') {
                register(@ARGV);
        }
+       elsif ($action eq 'bootstrap') {
+               bootstrap();
+       }
        elsif ($action eq 'remember' ||
               $action eq 'offline' ||
               $action eq 'online') {
        elsif ($action eq 'remember' ||
               $action eq 'offline' ||
               $action eq 'online') {
@@ -1123,6 +1141,25 @@ sub register {
        exec($command) || die "exec: $!";
 }
 
        exec($command) || die "exec: $!";
 }
 
+sub bootstrap {
+       my $url=shift @ARGV;
+
+       if (! defined $url || ! length $url) {
+               die "mr: bootstrap requires url\n";
+       }
+
+       if (-e ".mrconfig") {
+               die "mr: .mrconfig file already exists, not overwriting with $url\n";
+       }
+
+       if (system("curl", "-s", $url, "-o", ".mrconfig") != 0) {
+               die "mr: download of $url failed\n";
+       }
+
+       exec("mr $ENV{MR_SWITCHES} -c .mrconfig checkout");
+       die "failed to run mr checkout";
+}
+
 # alias expansion and command stemming
 sub expandaction {
        my $action=shift;
 # alias expansion and command stemming
 sub expandaction {
        my $action=shift;
@@ -1147,12 +1184,24 @@ sub expandaction {
        return $action;
 }
 
        return $action;
 }
 
+sub find_nearest_mrconfig {
+       my $dir=getcwd();
+       while (length $dir) {
+               if (-e "$dir/.mrconfig") {
+                       return "$dir/.mrconfig";
+               }
+               $dir=~s/\/[^\/]*$//;
+       }
+       die "no .mrconfig found in path\n";
+}
+
 sub getopts {
        my @saved=@ARGV;
        Getopt::Long::Configure("bundling", "no_permute");
        my $result=GetOptions(
                "d|directory=s" => sub { $directory=abs_path($_[1]) },
                "c|config=s" => sub { $ENV{MR_CONFIG}=$_[1]; $config_overridden=1 },
 sub getopts {
        my @saved=@ARGV;
        Getopt::Long::Configure("bundling", "no_permute");
        my $result=GetOptions(
                "d|directory=s" => sub { $directory=abs_path($_[1]) },
                "c|config=s" => sub { $ENV{MR_CONFIG}=$_[1]; $config_overridden=1 },
+               "p|path" => sub { $ENV{MR_CONFIG}=find_nearest_mrconfig(); $config_overridden=1 },
                "v|verbose" => \$verbose,
                "q|quiet" => \$quiet,
                "s|stats" => \$stats,
                "v|verbose" => \$verbose,
                "q|quiet" => \$quiet,
                "s|stats" => \$stats,
@@ -1376,6 +1425,7 @@ help =
        man -l "$tmp" || error "man failed"
 list = true
 config = 
        man -l "$tmp" || error "man failed"
 list = true
 config = 
+bootstrap = 
 
 online =
        if [ -s ~/.mrlog ]; then
 
 online =
        if [ -s ~/.mrlog ]; then