X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/6277f4c870c0b808d70220c68a5748c02820e02c..2e4e7de3c48c2e557a6e306507ed2fcd80b60d9b:/mr diff --git a/mr b/mr index 7d35892..fd380db 100755 --- a/mr +++ b/mr @@ -20,6 +20,8 @@ B [options] diff B [options] log +B [options] bootstrap url + B [options] register [repository] B [options] config section ["parameter=[value]" ...] @@ -98,6 +100,14 @@ These commands are also available: =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. @@ -179,6 +189,11 @@ the current working directory. 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. @@ -221,11 +236,6 @@ a good speedup in updates without loading the machine too much. =head1 FILES -The ~/.mrlog file contains commands that mr has remembered to run later, -due to being offline. You can delete or edit this file to remove commands, -or even to add other commands for 'mr online' to run. If the file is -present, mr assumes it is in offline mode. - B is configured by .mrconfig files. It starts by reading the .mrconfig file in your home directory, and this can in turn chain load .mrconfig files from repositories. @@ -341,16 +351,20 @@ the action that is performed for a given revision control system, you can override these rcs specific actions. To add a new revision control system, you can just add rcs specific actions for it. +The ~/.mrlog file contains commands that mr has remembered to run later, +due to being offline. You can delete or edit this file to remove commands, +or even to add other commands for 'mr online' to run. If the file is +present, mr assumes it is in offline mode. + =head1 EXTENSIONS -mr can be extended to support things such as unison and remote git -checkout. Some files providing such extensions are available in -/usr/share/mr/. See the documentation in the files for details about using -them. +mr can be extended to support things such as unison and git-svn. Some +files providing such extensions are available in /usr/share/mr/. See +the documentation in the files for details about using them. =head1 AUTHOR -Copyright 2007 Joey Hess +Copyright 2007-2009 Joey Hess Licensed under the GNU GPL version 2 or higher. @@ -419,7 +433,7 @@ sub rcs_test { chomp $rcs; if ($rcs=~/\n/s) { $rcs=~s/\n/, /g; - print STDERR "mr $action: found multiple possible repository types ($rcs) for $dir\n"; + print STDERR "mr $action: found multiple possible repository types ($rcs) for $topdir$subdir\n"; return undef; } if (! length $rcs) { @@ -512,22 +526,22 @@ sub action { elsif (! defined $command) { my $rcs=rcs_test(@_); if (! defined $rcs) { - print STDERR "mr $action: unknown repository type and no defined $action command for $dir\n"; + print STDERR "mr $action: unknown repository type and no defined $action command for $topdir$subdir\n"; return FAILED; } else { - print STDERR "mr $action: no defined action for $rcs repository $dir, skipping\n"; + print STDERR "mr $action: no defined action for $rcs repository $topdir$subdir, skipping\n"; return SKIPPED; } } else { if (! $no_chdir) { - print "mr $action: $dir\n" unless $quiet; + print "mr $action: $topdir$subdir\n" unless $quiet; } else { my $s=$directory; - $s=~s/^\Q$dir\E\/?//; - print "mr $action: $dir (in subdir $s)\n" unless $quiet; + $s=~s/^\Q$topdir$subdir\E\/?//; + print "mr $action: $topdir$subdir (in subdir $s)\n" unless $quiet; } $command="set -e; ".$lib. "my_action(){ $command\n }; my_action ". @@ -1019,6 +1033,9 @@ sub dispatch { elsif ($action eq 'register') { register(@ARGV); } + elsif ($action eq 'bootstrap') { + bootstrap(); + } elsif ($action eq 'remember' || $action eq 'offline' || $action eq 'online') { @@ -1124,6 +1141,25 @@ sub register { 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; @@ -1148,12 +1184,24 @@ sub expandaction { 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 }, + "p|path" => sub { $ENV{MR_CONFIG}=find_nearest_mrconfig(); $config_overridden=1 }, "v|verbose" => \$verbose, "q|quiet" => \$quiet, "s|stats" => \$stats, @@ -1276,7 +1324,7 @@ git_bare_test = svn_update = svn update "$@" git_update = git pull "$@" -bzr_update = bzr merge "$@" +bzr_update = bzr merge --pull "$@" cvs_update = cvs update "$@" hg_update = hg pull "$@" && hg update "$@" darcs_update = darcs pull -a "$@" @@ -1377,6 +1425,7 @@ help = man -l "$tmp" || error "man failed" list = true config = +bootstrap = online = if [ -s ~/.mrlog ]; then