git-svn, perl/Git.pm: extend and use Git->prompt method for querying users
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). This change extends the Git::prompt helper, so that it can also be used for non password queries, 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@cs-ware.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
8f3cab2b4d
commit
e9263e4580
28
perl/Git.pm
28
perl/Git.pm
@ -511,18 +511,19 @@ C<git --html-path>). Useful mostly only internally.
|
|||||||
|
|
||||||
sub html_path { command_oneline('--html-path') }
|
sub html_path { command_oneline('--html-path') }
|
||||||
|
|
||||||
=item prompt ( PROMPT )
|
=item prompt ( PROMPT , ISPASSWORD )
|
||||||
|
|
||||||
Query user C<PROMPT> and return answer from user.
|
Query user C<PROMPT> and return answer from user.
|
||||||
|
|
||||||
Honours GIT_ASKPASS and SSH_ASKPASS environment variables for querying
|
Honours GIT_ASKPASS and SSH_ASKPASS environment variables for querying
|
||||||
the user. If no *_ASKPASS variable is set or an error occoured,
|
the user. If no *_ASKPASS variable is set or an error occoured,
|
||||||
the terminal is tried as a fallback.
|
the terminal is tried as a fallback.
|
||||||
|
If C<ISPASSWORD> is set and true, the terminal disables echo.
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
sub prompt {
|
sub prompt {
|
||||||
my ($prompt) = @_;
|
my ($prompt, $isPassword) = @_;
|
||||||
my $ret;
|
my $ret;
|
||||||
if (exists $ENV{'GIT_ASKPASS'}) {
|
if (exists $ENV{'GIT_ASKPASS'}) {
|
||||||
$ret = _prompt($ENV{'GIT_ASKPASS'}, $prompt);
|
$ret = _prompt($ENV{'GIT_ASKPASS'}, $prompt);
|
||||||
@ -533,16 +534,20 @@ sub prompt {
|
|||||||
if (!defined $ret) {
|
if (!defined $ret) {
|
||||||
print STDERR $prompt;
|
print STDERR $prompt;
|
||||||
STDERR->flush;
|
STDERR->flush;
|
||||||
require Term::ReadKey;
|
if (defined $isPassword && $isPassword) {
|
||||||
Term::ReadKey::ReadMode('noecho');
|
require Term::ReadKey;
|
||||||
$ret = '';
|
Term::ReadKey::ReadMode('noecho');
|
||||||
while (defined(my $key = Term::ReadKey::ReadKey(0))) {
|
$ret = '';
|
||||||
last if $key =~ /[\012\015]/; # \n\r
|
while (defined(my $key = Term::ReadKey::ReadKey(0))) {
|
||||||
$ret .= $key;
|
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;
|
return $ret;
|
||||||
}
|
}
|
||||||
@ -550,6 +555,7 @@ sub prompt {
|
|||||||
sub _prompt {
|
sub _prompt {
|
||||||
my ($askpass, $prompt) = @_;
|
my ($askpass, $prompt) = @_;
|
||||||
return unless length $askpass;
|
return unless length $askpass;
|
||||||
|
$prompt =~ s/\n/ /g;
|
||||||
my $ret;
|
my $ret;
|
||||||
open my $fh, "-|", $askpass, $prompt or return;
|
open my $fh, "-|", $askpass, $prompt or return;
|
||||||
$ret = <$fh>;
|
$ret = <$fh>;
|
||||||
|
@ -62,16 +62,16 @@ sub ssl_server_trust {
|
|||||||
issuer_dname fingerprint);
|
issuer_dname fingerprint);
|
||||||
my $choice;
|
my $choice;
|
||||||
prompt:
|
prompt:
|
||||||
print STDERR $may_save ?
|
my $options = $may_save ?
|
||||||
"(R)eject, accept (t)emporarily or accept (p)ermanently? " :
|
"(R)eject, accept (t)emporarily or accept (p)ermanently? " :
|
||||||
"(R)eject or accept (t)emporarily? ";
|
"(R)eject or accept (t)emporarily? ";
|
||||||
STDERR->flush;
|
STDERR->flush;
|
||||||
$choice = lc(substr(<STDIN> || 'R', 0, 1));
|
$choice = lc(substr(Git::prompt("Certificate problem.\n" . $options) || 'R', 0, 1));
|
||||||
if ($choice =~ /^t$/i) {
|
if ($choice eq 't') {
|
||||||
$cred->may_save(undef);
|
$cred->may_save(undef);
|
||||||
} elsif ($choice =~ /^r$/i) {
|
} elsif ($choice eq 'r') {
|
||||||
return -1;
|
return -1;
|
||||||
} elsif ($may_save && $choice =~ /^p$/i) {
|
} elsif ($may_save && $choice eq 'p') {
|
||||||
$cred->may_save($may_save);
|
$cred->may_save($may_save);
|
||||||
} else {
|
} else {
|
||||||
goto prompt;
|
goto prompt;
|
||||||
@ -109,9 +109,7 @@ sub username {
|
|||||||
if (defined $_username) {
|
if (defined $_username) {
|
||||||
$username = $_username;
|
$username = $_username;
|
||||||
} else {
|
} else {
|
||||||
print STDERR "Username: ";
|
$username = Git::prompt("Username: ");
|
||||||
STDERR->flush;
|
|
||||||
chomp($username = <STDIN>);
|
|
||||||
}
|
}
|
||||||
$cred->username($username);
|
$cred->username($username);
|
||||||
$cred->may_save($may_save);
|
$cred->may_save($may_save);
|
||||||
@ -120,7 +118,7 @@ sub username {
|
|||||||
|
|
||||||
sub _read_password {
|
sub _read_password {
|
||||||
my ($prompt, $realm) = @_;
|
my ($prompt, $realm) = @_;
|
||||||
my $password = Git::prompt($prompt);
|
my $password = Git::prompt($prompt, 1);
|
||||||
$password;
|
$password;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user