X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=bin%2Frgit;h=6e3e04f397fe3f57dd9a128141ac0b6e01374b2d;hb=a5ba1389e8ec450b16fd6e283f3edc80df1878c9;hp=326d56edf3f4872485549e7702adc1bfc6ee5446;hpb=7a8f16273acc8e184a0bf1c74cb7812591c31e67;p=perl%2Fmodules%2Frgit.git diff --git a/bin/rgit b/bin/rgit index 326d56e..6e3e04f 100755 --- a/bin/rgit +++ b/bin/rgit @@ -8,12 +8,12 @@ use Config qw/%Config/; use Cwd qw/cwd/; use File::Spec::Functions qw/catfile path/; -use App::Rgit::Utils qw/:codes/; +use App::Rgit::Utils qw/:codes :levels/; use App::Rgit; our $VERSION; BEGIN { - $VERSION = '0.04'; + $VERSION = '0.05'; } my %opts; @@ -22,10 +22,9 @@ my $cmd; BEGIN { @ARGV = grep { defined $cmd ? $_ - : ( /^-([IKV]+)$/ ? do { $opts{$_} = 1 for split //, $1; () } - : do { $cmd = $_ unless /^-/; $_ } ) + : ( /^-([DIKV]+)$/ ? do { $opts{$_} = 1 for split //, $1; () } + : do { $cmd = $_ unless /^-/; $_ } ) } @ARGV; - warn "rgit $VERSION\n" if $opts{V}; $cmd = ' ' unless defined $cmd; } @@ -68,13 +67,18 @@ croak "Couldn't find any valid git executable" unless defined $git; my $root = $ENV{GIT_DIR}; $root = cwd unless defined $root; -exit App::Rgit->new( +my $ar = App::Rgit->new( git => $git, root => $root, cmd => $cmd, args => \@ARGV, policy => \&policy, -)->run; + debug => $opts{D} ? INFO : WARN, +); + +print STDOUT "rgit $VERSION\n" if $opts{V}; + +exit $ar->run; sub policy_default { my ($cmd, $conf, $repo, $status, $signal) = @_; @@ -95,28 +99,28 @@ sub policy_interactive { ); my $int = { GetControlChars() }->{INTERRUPT}; while (1) { - print STDERR "[a]bort, [i]gnore, [I]gnore all, [r]etry, open [s]hell ?"; + $conf->warn("[a]bort, [i]gnore, [I]gnore all, [r]etry, open [s]hell ?"); ReadMode(4); my $key = ReadKey(0); ReadMode(1); print STDERR "\n"; next unless defined $key; if ($key eq $int) { - print STDERR "Interrupted, aborting\n"; + $conf->warn("Interrupted, aborting\n"); return LAST; } elsif ($key eq 's') { if (defined $shell) { - print STDERR 'Opening shell in ', $repo->work, "\n"; + $conf->info('Opening shell in ', $repo->work, "\n"); my $cwd = cwd; $repo->chdir; system { $shell } $shell; - chroot $cwd; + chdir $cwd; } else { - print STDERR "Couldn't find any shell\n"; + $conf->err("Couldn't find any shell\n"); } } elsif (exists $codes{$key}) { my $code = $codes{$key}; - print STDERR 'Okay, ', $code->[1], "\n"; + $conf->info('Okay, ', $code->[1], "\n"); return $code->[0]; } } @@ -130,58 +134,58 @@ rgit - Recursively execute a command on all the git repositories in a directory =head1 VERSION -Version 0.04 +Version 0.05 =head1 SYNOPSIS - rgit [-K|-V|-I] [GIT_OPTIONS] COMMAND [COMMAND_ARGS] + rgit [-K|-I|-D|-V] [GIT_OPTIONS] COMMAND [COMMAND_ARGS] =head1 DESCRIPTION -This utility recursively searches in the current directory (or in the directory given by the C environment variable if it's set) for all git repositories, sort this list by the repository path, C into each of them, and executes the specified git command. -Moreover, those formats are substuted in the arguments before running the command : +This utility recursively searches in a root directory (which may be the current working directory or - if it has been set - the directory given by the C environment variable) for all git repositories, sort this list by the repository path, C into each of them, and executes the specified git command. +Moreover, those formats are substituted in the arguments before running the command : =over 4 =item * -C<^n> with the current repository name. +C<@n> with the current repository name. =item * -C<^g> with the relative path to the current repository. +C<@g> with the relative path (based from the root directory) to the current repository. =item * -C<^G> with the absolute path to the current repository. +C<@G> with the absolute path to the current repository. =item * -C<^w> with the relative path to the current repository's working directory. +C<@w> with the relative path (based from the root directory) to the current repository's working directory. =item * -C<^W> with the absolute path to the current repository's working directory. +C<@W> with the absolute path to the current repository's working directory. =item * -C<^b> with a "bareified" relative path, i.e. C<^g> if this is a bare repository, and C<^w.git> otherwise. +C<@b> with a "bareified" relative path, i.e. C<@g> if this is a bare repository, and C<@w.git> otherwise. =item * -C<^B> with an absolute version of the "bareified" path. +C<@B> with an absolute version of the "bareified" path. =item * -C<^R> with the absolute path to the current root directory. +C<@R> with the absolute path to the root directory. =item * -C<^^> with a bare C<^>. +C<@@> with a bare C<@>. =back -There are actually a few commands that are only executed once in the current directory : C, C, C, C and C. +There are actually a few commands that are only executed once in the root directory : C, C, C, C and C. For any of those, no format substitution is done. You can specify which C executable to use with the C environment variable. @@ -211,6 +215,12 @@ This lets you choose interactively what to do when one of the commands returns a =item * +C<-D> + +Outputs diagnostics. + +=item * + C<-V> Outputs the version. @@ -225,11 +235,11 @@ Execute C on all the repositories below the current directory : Tag all the repositories with their name : - rgit tag ^n + rgit tag @n Add a remote to all repositories in "/foo/bar" to their bare counterpart in C on F : - GIT_DIR="/foo/bar" rgit remote add host git://host/qux/^b + GIT_DIR="/foo/bar" rgit remote add host git://host/qux/@b =head1 DEPENDENCIES