X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FApp%2FRgit%2FPolicy%2FInteractive.pm;fp=lib%2FApp%2FRgit%2FPolicy%2FInteractive.pm;h=de251b3c6bc1c062c7cc31bdad68f7aa7974d81f;hb=dc668e3c302569ed2b5eb2ed893247308f22528a;hp=0000000000000000000000000000000000000000;hpb=edfd59020168422fe2c1baa014f0925968a77c9a;p=perl%2Fmodules%2Frgit.git diff --git a/lib/App/Rgit/Policy/Interactive.pm b/lib/App/Rgit/Policy/Interactive.pm new file mode 100644 index 0000000..de251b3 --- /dev/null +++ b/lib/App/Rgit/Policy/Interactive.pm @@ -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. + +=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. + +=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