git-svn reads usernames and other user queries from an interactive terminal. This cause GUIs (w/o STDIN connected) to hang waiting forever for git-svn to complete (http://code.google.com/p/tortoisegit/issues/detail?id=967). git-core already asks for username using *_ASKPASS tools, this commit also enables git-svn to do so. This change extends the Git::prompt method, so that it can also be used for non password queries (e.g. usernames), and makes use of it instead of using hand-rolled prompt-response code that only works with the interactive terminal. Signed-off-by: Sven Strickroth <email@xxxxxxxxxx> --- git-svn.perl | 19 ++++++++----------- perl/Git.pm | 27 ++++++++++++++++----------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/git-svn.perl b/git-svn.perl index ade88ae..be713f5 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -4356,17 +4356,16 @@ sub ssl_server_trust { map $cert_info->$_, qw(hostname valid_from valid_until issuer_dname fingerprint); my $choice; -prompt: - print STDERR $may_save ? + my $options = $may_save ? "(R)eject, accept (t)emporarily or accept (p)ermanently? " : "(R)eject or accept (t)emporarily? "; - STDERR->flush; - $choice = lc(substr(<STDIN> || 'R', 0, 1)); - if ($choice =~ /^t$/i) { +prompt: + $choice = lc(substr(Git::prompt($options) || 'R', 0, 1)); + if ($choice eq 't') { $cred->may_save(undef); - } elsif ($choice =~ /^r$/i) { + } elsif ($choice eq 'r') { return -1; - } elsif ($may_save && $choice =~ /^p$/i) { + } elsif ($may_save && $choice eq 'p') { $cred->may_save($may_save); } else { goto prompt; @@ -4404,9 +4403,7 @@ sub username { if (defined $_username) { $username = $_username; } else { - print STDERR "Username: "; - STDERR->flush; - chomp($username = <STDIN>); + $username = Git::prompt("Username: "); } $cred->username($username); $cred->may_save($may_save); @@ -4415,7 +4412,7 @@ sub username { sub _read_password { my ($prompt, $realm) = @_; - my $password = Git::prompt($prompt); + my $password = Git::prompt($prompt, 1); $password; } diff --git a/perl/Git.pm b/perl/Git.pm index 46f11a8..33e68c4 100644 --- a/perl/Git.pm +++ b/perl/Git.pm @@ -512,18 +512,19 @@ C<git --html-path>). Useful mostly only internally. sub html_path { command_oneline('--html-path') } -=item prompt ( PROMPT ) +=item prompt ( PROMPT , ISPASSWORD ) Query user C<PROMPT> and return answer from user. If an external helper is specified via GIT_ASKPASS or SSH_ASKPASS, it is used to interact with the user; otherwise the prompt is given to and the answer is read from the terminal. +If C<ISPASSWORD> is true, the terminal disables echo. =cut sub prompt { - my ($prompt) = @_; + my ($prompt, $isPassword) = @_; my $ret; if (!defined $ret) { $ret = _prompt($ENV{'GIT_ASKPASS'}, $prompt); @@ -532,18 +533,22 @@ sub prompt { $ret = _prompt($ENV{'SSH_ASKPASS'}, $prompt); } if (!defined $ret) { - $ret = ''; print STDERR $prompt; STDERR->flush; - require Term::ReadKey; - Term::ReadKey::ReadMode('noecho'); - while (defined(my $key = Term::ReadKey::ReadKey(0))) { - last if $key =~ /[\012\015]/; # \n\r - $ret .= $key; + if ($isPassword) { + $ret = ''; + require Term::ReadKey; + Term::ReadKey::ReadMode('noecho'); + while (defined(my $key = Term::ReadKey::ReadKey(0))) { + last if $key =~ /[\012\015]/; # \n\r + $ret .= $key; + } + Term::ReadKey::ReadMode('restore'); + print STDERR "\n"; + STDERR->flush; + } else { + chomp($ret = <STDIN>); } - Term::ReadKey::ReadMode('restore'); - print STDERR "\n"; - STDERR->flush; } return $ret; } -- 1.7.8.msysgit.0 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html