Signed-off-by: Sven Strickroth <email@xxxxxxxxxx> --- git-svn.perl | 37 ++++--------------------------------- perl/Git.pm | 43 +++++++++++++++++++++++++++++++------------ 2 files changed, 35 insertions(+), 45 deletions(-) diff --git a/git-svn.perl b/git-svn.perl index 2c99aaa..1f30dc2 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -4360,12 +4360,7 @@ prompt: my $options = $may_save ? "(R)eject, accept (t)emporarily or accept (p)ermanently? " : "(R)eject or accept (t)emporarily? "; - $choice = Git->askpass_prompt("Certificate unknown. " . $options); - if (!defined $choice) { - print STDERR $options; - STDERR->flush; - $choice = lc(substr(<STDIN> || 'R', 0, 1)); - } + $choice = substr(Git->prompt("Certificate unknown. " . $options) || 'R', 0, 1); if ($choice =~ /^t$/i) { $cred->may_save(undef); } elsif ($choice =~ /^r$/i) { @@ -4382,13 +4377,7 @@ prompt: sub ssl_client_cert { my ($cred, $realm, $may_save, $pool) = @_; $may_save = undef if $_no_auth_cache; - my $filename = Git->askpass_prompt("Client certificate filename:"); - if (!defined $filename) { - print STDERR "Client certificate filename: "; - STDERR->flush; - chomp($filename = <STDIN>); - } - $cred->cert_file($filename); + $cred->cert_file(Git->prompt("Client certificate filename: ")); $cred->may_save($may_save); $SVN::_Core::SVN_NO_ERROR; } @@ -4411,12 +4400,7 @@ sub username { if (defined $_username) { $username = $_username; } else { - $username = Git->askpass_prompt("Username"); - } - if (!defined $username) { - print STDERR "Username: "; - STDERR->flush; - chomp($username = <STDIN>); + $username = Git->prompt("Username: "); } $cred->username($username); $cred->may_save($may_save); @@ -4425,20 +4409,7 @@ sub username { sub _read_password { my ($prompt, $realm) = @_; - my $password = Git->askpass_prompt($prompt);; - if (!defined $password) { - 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 - $password .= $key; - } - Term::ReadKey::ReadMode('restore'); - print STDERR "\n"; - STDERR->flush; - } + my $password = Git->prompt($prompt, 1); $password; } diff --git a/perl/Git.pm b/perl/Git.pm index c6b3e11..acc00b4 100644 --- a/perl/Git.pm +++ b/perl/Git.pm @@ -58,7 +58,7 @@ require Exporter; command_output_pipe command_input_pipe command_close_pipe command_bidi_pipe command_close_bidi_pipe version exec_path html_path hash_object git_cmd_try - remote_refs askpass_prompt + remote_refs prompt temp_acquire temp_release temp_reset temp_path); @@ -512,30 +512,49 @@ C<git --html-path>). Useful mostly only internally. sub html_path { command_oneline('--html-path') } -=item askpass_prompt ( PROMPT) +=item prompt ( PROMPT , ISPASSWORD ) -Asks user using *_ASKPASS programs and return answer from user. +Asks user using *_ASKPASS programs or terminal the prompt C<PROMPT> and return answer from user. Checks if GIT_ASKPASS or SSH_ASKPASS is set, and use first matching for querying user and returns answer. If no *_ASKPASS variable is set, the variable is empty or an error occours, -it returns undef and the caller has to ask the user (e.g. on terminal). +the querying the user using terminal is tried. If C<ISPASSWORD> is set and true, +the terminal disables echo. =cut -sub askpass_prompt { - my ($self, $prompt) = _maybe_self(@_); +sub prompt { + my ($self, $prompt, $isPassword) = _maybe_self(@_); + my $ret; if (exists $ENV{'GIT_ASKPASS'}) { - return _askpass_prompt($ENV{'GIT_ASKPASS'}, $prompt); - } elsif (exists $ENV{'SSH_ASKPASS'}) { - return _askpass_prompt($ENV{'SSH_ASKPASS'}, $prompt); - } else { - return undef; + $ret = _prompt($ENV{'GIT_ASKPASS'}, $prompt); } + if (!defined $ret && exists $ENV{'SSH_ASKPASS'}) { + $ret = _prompt($ENV{'SSH_ASKPASS'}, $prompt); + } + if (!defined $ret) { + print STDERR $prompt; + STDERR->flush; + if (defined $isPassword && $isPassword) { + 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>); + } + } + return $ret; } -sub _askpass_prompt { +sub _prompt { my ($self, $askpass, $prompt) = _maybe_self(@_); unless ($askpass) { return undef; -- Best regards, Sven Strickroth ClamAV, a GPL anti-virus toolkit http://www.clamav.net PGP key id F5A9D4C4 @ any key-server -- 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