X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=bin%2Frgit;h=98510c2879ab92f7565abe3332f3952552a179b2;hb=511d4fe4b46173353cd1fdcac0d26ac067868280;hp=7124217c474b6e68b2f55e2770bc33bcab76053c;hpb=bf474959f3dd2c2dd3ed602b4af1f8a7ac5c1cbf;p=perl%2Fmodules%2Frgit.git diff --git a/bin/rgit b/bin/rgit index 7124217..98510c2 100755 --- a/bin/rgit +++ b/bin/rgit @@ -3,17 +3,18 @@ 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/croak/; +use Config qw/%Config/; +use Cwd qw/cwd/; +use File::Spec (); # catfile, path -use App::Rgit::Utils qw/:codes :levels/; use App::Rgit; +use App::Rgit::Utils qw/:levels/; +use App::Rgit::Policy; our $VERSION; BEGIN { - $VERSION = '0.05'; + $VERSION = '0.06'; } my %opts; @@ -28,34 +29,25 @@ BEGIN { $cmd = ' ' unless defined $cmd; } -my $shell; +my $policy; -BEGIN { - if (-t && $opts{I}) { - if (eval "require Term::ReadKey; 1") { - Term::ReadKey->import; - *policy = \&policy_interactive; - for (grep defined, $ENV{SHELL}, '/bin/sh') { - if (-x $_) { - $shell = $_; - last; - } - } - } else { - warn "You have to install Term::ReadKey to use the interactive mode.\n"; - } - } - *policy = $opts{K} ? \&policy_keep - : \&policy_default - unless defined *policy{CODE}; +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'); } setpgrp 0, 0 if $Config{d_setpgrp}; my $git = $ENV{GIT_EXEC_PATH}; unless (defined $git) { - for (path) { - my $g = catfile $_, 'git'; + for (File::Spec->path) { + my $g = File::Spec->catfile($_, 'git'); if (-x $g) { $git = $g; last; @@ -72,7 +64,7 @@ my $ar = App::Rgit->new( root => $root, cmd => $cmd, args => \@ARGV, - policy => \&policy, + policy => $policy, debug => $opts{D} ? INFO : WARN, ); @@ -80,52 +72,6 @@ print STDOUT "rgit $VERSION\n" if $opts{V}; exit $ar->run; -sub policy_default { - my ($cmd, $conf, $repo, $status, $signal) = @_; - return NEXT unless $status; - return LAST; -} - -sub policy_keep { NEXT } - -sub policy_interactive { - my ($cmd, $conf, $repo, $status, $signal) = @_; - return NEXT unless $status; - my %codes = ( - 'a' => [ LAST, 'aborting' ], - 'i' => [ NEXT, 'ignoring' ], - 'I' => [ NEXT | SAVE, 'ignoring all' ], - 'r' => [ REDO, 'retrying' ], - ); - my $int = { GetControlChars() }->{INTERRUPT}; - while (1) { - $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) { - $conf->warn("Interrupted, aborting\n"); - return LAST; - } elsif ($key eq 's') { - if (defined $shell) { - $conf->info('Opening shell in ', $repo->work, "\n"); - my $cwd = cwd; - $repo->chdir; - system { $shell } $shell; - chdir $cwd; - } else { - $conf->err("Couldn't find any shell\n"); - } - } elsif (exists $codes{$key}) { - my $code = $codes{$key}; - $conf->info('Okay, ', $code->[1], "\n"); - return $code->[0]; - } - } -} - __END__ =head1 NAME @@ -134,7 +80,7 @@ rgit - Recursively execute a command on all the git repositories in a directory =head1 VERSION -Version 0.05 +Version 0.06 =head1 SYNOPSIS @@ -143,45 +89,47 @@ Version 0.05 =head1 DESCRIPTION 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 (based from the root directory) 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 (based from the root directory) 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 root directory. +C<%R> with the absolute path to the root directory. =item * -C<^^> with a bare C<^>. +C<%%> with a bare C<%>. =back @@ -235,17 +183,15 @@ 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 @@ -255,7 +201,8 @@ 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 @@ -267,7 +214,7 @@ Tests code coverage report is available at L