You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by da...@apache.org on 2014/02/20 02:51:14 UTC

svn commit: r1570047 - /subversion/trunk/tools/dist/backport.pl

Author: danielsh
Date: Thu Feb 20 01:51:13 2014
New Revision: 1570047

URL: http://svn.apache.org/r1570047
Log:
backport.pl interactive mode: Ignore stray keystrokes.

* tools/dist/backport.pl
  (POSIX::isprint, POSIX::isspace): New use()s.
  (prompt): Detect and discard invalid keystrokes.

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=1570047&r1=1570046&r2=1570047&view=diff
==============================================================================
--- subversion/trunk/tools/dist/backport.pl (original)
+++ subversion/trunk/tools/dist/backport.pl Thu Feb 20 01:51:13 2014
@@ -26,7 +26,7 @@ use Term::ReadKey qw/ReadMode ReadKey/;
 use File::Basename qw/basename dirname/;
 use File::Copy qw/copy move/;
 use File::Temp qw/tempfile/;
-use POSIX qw/ctermid strftime/;
+use POSIX qw/ctermid strftime isprint isspace/;
 use Text::Wrap qw/wrap/;
 use Tie::File ();
 
@@ -76,7 +76,7 @@ my ($AVAILID) = $ENV{AVAILID} // do {
 my $STATUS = './STATUS';
 my $STATEFILE = './.backports1';
 my $BRANCHES = '^/subversion/branches';
-$ENV{LC_ALL} = "C";  # since we parse 'svn info' output
+$ENV{LC_ALL} = "C";  # since we parse 'svn info' output and use isprint()
 
 # Globals.
 my %ERRORS = ();
@@ -203,10 +203,17 @@ sub prompt {
   my %args = @_;
   my $getchar = sub {
     my $answer;
-    ReadMode 'cbreak';
-    eval { $answer = (ReadKey 0) };
-    ReadMode 'normal';
-    die $@ if $@;
+    do {
+      ReadMode 'cbreak';
+      $answer = (ReadKey 0);
+      ReadMode 'normal';
+      die if $@ or not defined $answer;
+      # Swallow terminal escape codes (e.g., arrow keys).
+      unless (isprint $answer or isspace $answer) {
+        $answer = (ReadKey -1) while defined $answer;
+        # TODO: provide an indication that the keystroke was sensed and ignored.
+      }
+    } until defined $answer and (isprint $answer or isspace $answer);
     print $answer;
     return $answer;
   };