]>
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:
or even to add other commands for 'mr online' to run. If the file is
present, mr assumes it is in offline mode.
or even to add other commands for 'mr online' to run. If the file is
present, mr assumes it is in offline mode.
-=head "UNTRUSTED MRCONFIG FILES"
+=head1 "UNTRUSTED MRCONFIG FILES"
Since mrconfig files can contain arbitrary shell commands, they can do
anything. This flexability is good, but it also allows a malicious mrconfig
Since mrconfig files can contain arbitrary shell commands, they can do
anything. This flexability is good, but it also allows a malicious mrconfig
if ($ret == OK) {
push @ok, $dir;
if ($ret == OK) {
push @ok, $dir;
+ print "\n" unless $quiet ;
}
elsif ($ret == FAILED) {
if ($interactive) {
}
elsif ($ret == FAILED) {
if ($interactive) {
system((getpwuid($<))[8], "-i");
}
push @failed, $dir;
system((getpwuid($<))[8], "-i");
}
push @failed, $dir;
+ print "\n" unless $quiet ;
}
elsif ($ret == SKIPPED) {
push @skipped, $dir;
}
elsif ($ret == SKIPPED) {
push @skipped, $dir;
open($in, "<", $f) || die "mr: open $f: $!\n";
}
my @lines=<$in>;
open($in, "<", $f) || die "mr: open $f: $!\n";
}
my @lines=<$in>;
+ close $in unless ref $f eq 'GLOB' ;
+sub startingconfig {
+ %alias=%config=%configfiles=%knownactions=%loaded=();
+ my $datapos=tell(DATA);
+ loadconfig(\*DATA);
+ seek(DATA,$datapos,0); # rewind
+}
+
sub modifyconfig {
my $f=shift;
# the section to modify or add
sub modifyconfig {
my $f=shift;
# the section to modify or add
die $@ if $@;
my $tmpconfig=File::Temp->new();
if (system("curl", "-A", "mr", "-s", $url, "-o", $tmpconfig) != 0) {
die $@ if $@;
my $tmpconfig=File::Temp->new();
if (system("curl", "-A", "mr", "-s", $url, "-o", $tmpconfig) != 0) {
- die "mr: download of $url failed\n";
+ die "mr bootstrap : download of $url failed\n";
if exists $config{$topdir}{"."}{"checkout"};
if (-e ".mrconfig") {
if exists $config{$topdir}{"."}{"checkout"};
if (-e ".mrconfig") {
- print STDERR "mr: .mrconfig file already exists, not overwriting with $url\n";
+ print STDERR "mr bootstrap : .mrconfig file already exists, not overwriting with $url\n";
- rename($tmpconfig, ".mrconfig") || die "rename: $!";
- }
-
- exec("mr $ENV{MR_SWITCHES} -c .mrconfig checkout");
- die "failed to run mr checkout";
+ eval q{use File::Copy};
+ die $@ if $@;
+ move($tmpconfig, ".mrconfig") || die "rename: $!";
+ }
+
+ # Reload the config file (in case we got a different version)
+ # and checkout everything else.
+ startingconfig();
+ loadconfig(".mrconfig");
+ dispatch("checkout");
+ @skipped=grep { abs_path($_) ne abs_path($topdir) } @skipped;
+ showstats("bootstrap");
+ exitstats();
}
# alias expansion and command stemming
}
# alias expansion and command stemming
$ENV{MR_PATH}=$Bin."/".$Script;
};
}
$ENV{MR_PATH}=$Bin."/".$Script;
};
}
+
+sub exitstats {
+ if (@failed) {
+ exit 1;
+ }
+ elsif (! @ok && @skipped) {
+ exit 1;
+ }
+ else {
+ exit 0;
+ }
+}
sub main {
getopts();
init();
sub main {
getopts();
init();
loadconfig($ENV{MR_CONFIG});
#use Data::Dumper; print Dumper(\%config);
my $action=expandaction(shift @ARGV);
dispatch($action);
loadconfig($ENV{MR_CONFIG});
#use Data::Dumper; print Dumper(\%config);
my $action=expandaction(shift @ARGV);
dispatch($action);
- if (@failed) {
- exit 1;
- }
- elsif (! @ok && @skipped) {
- exit 1;
- }
- else {
- exit 0;
- }
+ showstats($action);
+ exitstats();
}
# Finally, some useful actions that mr knows about by default.
}
# Finally, some useful actions that mr knows about by default.
darcs_trusted_checkout = darcs get $url $repo
git_bare_trusted_checkout = git clone --bare $url $repo
darcs_trusted_checkout = darcs get $url $repo
git_bare_trusted_checkout = git clone --bare $url $repo
+ case `uname -s` in
+ SunOS)
+ SHOWMANFILE="man -f"
+ ;;
+ Darwin)
+ SHOWMANFILE="man"
+ ;;
+ *)
+ SHOWMANFILE="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"
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 =
list = true
config =
bootstrap =