]> git.vpit.fr Git - perl/modules/rgit.git/blobdiff - lib/App/Rgit/Policy/Interactive.pm
Move policies to a new App::Rgit::Policy class layout
[perl/modules/rgit.git] / lib / App / Rgit / Policy / Interactive.pm
diff --git a/lib/App/Rgit/Policy/Interactive.pm b/lib/App/Rgit/Policy/Interactive.pm
new file mode 100644 (file)
index 0000000..de251b3
--- /dev/null
@@ -0,0 +1,122 @@
+package App::Rgit::Policy::Interactive;
+
+use strict;
+use warnings;
+
+use Cwd ();
+
+use App::Rgit::Utils qw/:codes/;
+
+use base qw/App::Rgit::Policy/;
+
+=head1 NAME
+
+App::Rgit::Policy::Interactive - A policy that asks what to do on error.
+
+=head1 VERSION
+
+Version 0.06
+
+=cut
+
+our $VERSION = '0.06';
+
+my ($int_code, $shell);
+
+sub new {
+ my $class = shift;
+ $class = ref $class || $class;
+
+ eval "require Term::ReadKey"
+      or die "You have to install Term::ReadKey to use the interactive mode.\n";
+
+ unless (defined $int_code) {
+  $int_code = { Term::ReadKey::GetControlChars() }->{INTERRUPT};
+ }
+
+ unless (defined $shell) {
+  for (grep defined, $ENV{SHELL}, '/bin/sh') {
+   if (-x $_) {
+    $shell = $_;
+    last;
+   }
+  }
+ }
+
+ $class->SUPER::new(@_);
+}
+
+my %codes = (
+ 'a' => [ LAST,        'aborting' ],
+ 'i' => [ NEXT,        'ignoring' ],
+ 'I' => [ NEXT | SAVE, 'ignoring all' ],
+ 'r' => [ REDO,        'retrying' ],
+);
+
+sub report {
+ my ($policy, $cmd, $conf, $repo, $status, $signal) = @_;
+
+ return NEXT unless $status;
+
+ while (1) {
+  $conf->warn("[a]bort, [i]gnore, [I]gnore all, [r]etry, open [s]hell ?");
+
+  Term::ReadKey::ReadMode(4);
+  my $key = Term::ReadKey::ReadKey(0);
+  Term::ReadKey::ReadMode(1);
+
+  $conf->warn("\n");
+
+  next unless defined $key;
+
+  if ($key eq $int_code) {
+   $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::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];
+  }
+ }
+}
+
+=head1 SEE ALSO
+
+L<rgit>.
+
+=head1 AUTHOR
+
+Vincent Pit, C<< <perl at profvince.com> >>, L<http://profvince.com>.
+   
+You can contact me by mail or on C<irc.perl.org> (vincent).
+
+=head1 BUGS
+
+Please report any bugs or feature requests to C<bug-rgit at rt.cpan.org>, or through the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=rgit>.
+I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
+
+=head1 SUPPORT
+
+You can find documentation for this module with the perldoc command.
+
+    perldoc App::Rgit::Policy::Interactive
+
+=head1 COPYRIGHT & LICENSE
+
+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.
+
+=cut
+
+1; # End of App::Rgit::Policy::Interactive