From: Vincent Pit Date: Mon, 20 Oct 2008 22:11:10 +0000 (+0200) Subject: Add an open shell option in interactive mode X-Git-Tag: v0.05~2 X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2Frgit.git;a=commitdiff_plain;h=7a8f16273acc8e184a0bf1c74cb7812591c31e67 Add an open shell option in interactive mode --- diff --git a/bin/rgit b/bin/rgit index 6b74789..326d56e 100755 --- a/bin/rgit +++ b/bin/rgit @@ -29,40 +29,26 @@ BEGIN { $cmd = ' ' unless defined $cmd; } +my $shell; + 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; - }; + *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 = 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}; + *policy = $opts{K} ? \&policy_keep + : \&policy_default + unless defined *policy{CODE}; } setpgrp 0, 0 if $Config{d_setpgrp}; @@ -90,6 +76,52 @@ exit App::Rgit->new( policy => \&policy, )->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) { + print STDERR "[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) { + print STDERR "Interrupted, aborting\n"; + return LAST; + } elsif ($key eq 's') { + if (defined $shell) { + print STDERR 'Opening shell in ', $repo->work, "\n"; + my $cwd = cwd; + $repo->chdir; + system { $shell } $shell; + chroot $cwd; + } else { + print STDERR "Couldn't find any shell\n"; + } + } elsif (exists $codes{$key}) { + my $code = $codes{$key}; + print STDERR 'Okay, ', $code->[1], "\n"; + return $code->[0]; + } + } +} + __END__ =head1 NAME