]> git.vpit.fr Git - perl/modules/rgit.git/blobdiff - lib/App/Rgit/Command/Each.pm
Make sure we chdir to the original directory at the end of App::Rgit::Command::Each...
[perl/modules/rgit.git] / lib / App / Rgit / Command / Each.pm
index a42ddb886d988b06ed55fc2ce0e73e6261a93cd7..d111f3243423b05046ffcebb88f76332a3fee90c 100644 (file)
@@ -5,17 +5,20 @@ use warnings;
 
 use base qw/App::Rgit::Command/;
 
+use App::Rgit::Guard;
+use App::Rgit::Utils qw/:codes/;
+
 =head1 NAME
 
 App::Rgit::Command::Each - Class for commands to execute for each repository.
 
 =head1 VERSION
 
-Version 0.03
+Version 0.06
 
 =cut
 
-our $VERSION = '0.03';
+our $VERSION = '0.06';
 
 =head1 DESCRIPTION
 
@@ -36,20 +39,38 @@ It implements :
 sub run {
  my $self = shift;
  my $conf = shift;
+
  my $status = 0;
+ my $code;
+
+ my $repos = 0;
+ my $guard = App::Rgit::Guard->new(sub { $conf->cwd_repo->chdir if $repos });
+
  for (@{$conf->repos}) {
   $_->chdir or next;
-  $status = $_->run($conf, @{$self->args});
-  last if $status;
+  ++$repos;
+
+  ($status, my $signal) = $_->run($conf, @{$self->args});
+
+  $code = $self->report($conf, $_, $status, $signal) unless defined $code;
+
+  last if $code & LAST;
+  if ($code & REDO) {
+   undef $code; # Don't save it, that would be very dumb
+   redo;
+  }
+  undef $code unless $code & SAVE;
  }
- $conf->cwd_repo->chdir;
- return $status;
+
+ return wantarray ? ($status, $code) : $status;
 }
 
 =head1 SEE ALSO
 
 L<rgit>.
 
+L<App::Rgit::Command>.
+
 =head1 AUTHOR
 
 Vincent Pit, C<< <perl at profvince.com> >>, L<http://profvince.com>.
@@ -68,7 +89,7 @@ You can find documentation for this module with the perldoc command.
 
 =head1 COPYRIGHT & LICENSE
 
-Copyright 2008 Vincent Pit, all rights reserved.
+Copyright 2008,2009,2010 Vincent Pit, all rights reserved.
 
 This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.