X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2Frgit.git;a=blobdiff_plain;f=bin%2Frgit;h=cb9d31e115d082fac774bb39b855d7a69dd015dd;hp=6b747898dcaf3218756c92c346a1c47b1432aab8;hb=HEAD;hpb=e2d33c28b878ab8e997831b1b8be768fdc76c780 diff --git a/bin/rgit b/bin/rgit index 6b74789..cb9d31e 100755 --- a/bin/rgit +++ b/bin/rgit @@ -3,17 +3,17 @@ use strict; use warnings; -use Carp qw/croak/; -use Config qw/%Config/; -use Cwd qw/cwd/; -use File::Spec::Functions qw/catfile path/; +use Carp qw; +use Config qw<%Config>; +use Cwd qw; -use App::Rgit::Utils qw/:codes/; use App::Rgit; +use App::Rgit::Utils qw<:levels>; +use App::Rgit::Policy; our $VERSION; BEGIN { - $VERSION = '0.04'; + $VERSION = '0.08'; } my %opts; @@ -22,73 +22,39 @@ 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; } -BEGIN { - if (-t && $opts{I}) { - if (eval "require Term::ReadKey; 1") { - Term::ReadKey->import; - *policy = sub { - my ($cmd, $conf, $repo, $status, $signal) = @_; - return NEXT unless $status; - print STDERR 'The command failed for ' . $repo->work . "\n"; - print STDERR "[a]bort, [i]gnore, [I]gnore all, [r]etry ?"; - ReadMode(4); - my $key = ReadKey(0); - ReadMode(1); - print STDERR "\n"; - my %codes = ( - 'a' => LAST, - 'i' => NEXT, - 'I' => NEXT | SAVE, - 'r' => REDO, - ); - $key = 'a' unless defined $key; - my $code = $codes{$key}; - $code = $codes{a} unless defined $code; - return $code; - }; - } else { - warn "You have to install Term::ReadKey to use the interactive mode.\n"; - } - } - *policy = sub { NEXT } if $opts{K} and not defined *policy{CODE}; - *policy = sub { - my ($cmd, $conf, $repo, $status, $signal) = @_; - return NEXT unless $status; - return LAST; - } unless defined *policy{CODE}; -} - -setpgrp 0, 0 if $Config{d_setpgrp}; +my $policy; -my $git = $ENV{GIT_EXEC_PATH}; -unless (defined $git) { - for (path) { - my $g = catfile $_, 'git'; - if (-x $g) { - $git = $g; - last; - } - } +if (-t && $opts{I}) { + $policy = 'Interactive'; +} elsif ($opts{K}) { + $policy = 'Keep'; +} +$policy = eval { App::Rgit::Policy->new(policy => $policy) }; +if (not defined $policy) { + print STDERR $@ if $@; + $policy = App::Rgit::Policy->new(policy => 'Default'); } -croak "Couldn't find any valid git executable" unless defined $git; -my $root = $ENV{GIT_DIR}; -$root = cwd unless defined $root; +setpgrp 0, 0 if $Config{d_setpgrp}; -exit App::Rgit->new( - git => $git, - root => $root, +my $ar = App::Rgit->new( + git => undef, # Autodiscovery + root => undef, # Autodiscovery cmd => $cmd, args => \@ARGV, - policy => \&policy, -)->run; + policy => $policy, + debug => $opts{D} ? INFO : WARN, +); + +print STDOUT "rgit $VERSION\n" if $opts{V}; + +exit $ar->run; __END__ @@ -98,58 +64,60 @@ rgit - Recursively execute a command on all the git repositories in a directory =head1 VERSION -Version 0.04 +Version 0.08 =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. +For efficiency reasons, repositories located inside a bare repository or under the F<.git> directory of a work repository won't be searched for. + +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. @@ -179,6 +147,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. @@ -193,27 +167,26 @@ 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 -The core modules L, L, L, L, L, L and L. - -L. +The core modules L, L, L, L, L, L and L. =head1 AUTHOR Vincent Pit, C<< >>, L. - + You can contact me by mail or on C (vincent). =head1 BUGS -Please report any bugs or feature requests to C, or through the web interface at L. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. +Please report any bugs or feature requests to C, or through the web interface at L. +I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. =head1 SUPPORT @@ -225,7 +198,7 @@ Tests code coverage report is available at L