Author: danielsh
Date: Mon Jul 29 08:10:32 2013
New Revision: 1507967

URL: http://svn.apache.org/r1507967
Log:
backport.pl: Restore cooked mode upon abnormal termination.

* tools/dist/backport.pl
  (prompt.$getchar): Restore cooked mode if ReadKey croaked.
  (signal_handler): New.
  (main): Use signal_handler() to restore cooked mode if ReadKey was
    interrupted by a SIGTERM.

Modified:
    subversion/trunk/tools/dist/backport.pl

Modified: subversion/trunk/tools/dist/backport.pl
URL: 
http://svn.apache.org/viewvc/subversion/trunk/tools/dist/backport.pl?rev=1507967&r1=1507966&r2=1507967&view=diff
==============================================================================
--- subversion/trunk/tools/dist/backport.pl (original)
+++ subversion/trunk/tools/dist/backport.pl Mon Jul 29 08:10:32 2013
@@ -139,9 +139,11 @@ sub prompt {
   print $_[0]; shift;
   my %args = @_;
   my $getchar = sub {
+    my $answer;
     ReadMode 'cbreak';
-    my $answer = (ReadKey 0);
+    eval { $answer = (ReadKey 0) };
     ReadMode 'normal';
+    die $@ if $@;
     print $answer;
     return $answer;
   };
@@ -492,6 +494,17 @@ sub maybe_revert {
   (@_ ? exit : return);
 }
 
+sub signal_handler {
+  my $sig = shift;
+
+  # Clean up after prompt()
+  ReadMode 'normal';
+
+  # Fall back to default action
+  delete $SIG{$sig};
+  kill $sig, $$;
+}
+
 sub warning_summary {
   return unless %ERRORS;
 
@@ -715,6 +728,7 @@ sub main {
   }
 
   $SIG{INT} = \&maybe_revert unless $YES;
+  $SIG{TERM} = \&signal_handler unless $YES;
 
   my $in_approved = 0;
   while (<STATUS>) {


Reply via email to