Hi, Am 30.11.2011 07:44 schrieb Jeff King: > That aside, I think this is an improvement over the current code. > 1. Regular git will also respect SSH_ASKPASS > 2. Regular git will ignore an askpass variable that is set but empty. > Perhaps git-svn should be refactored to have a reusable "prompt" > function that respects askpass and tries to behave like C git? It could > even go into the Git perl module. I honoured all your ideas. Hopefully the patches can be applied now. The new patches follow (you can also pull from git://github.com/csware/git.git askpass-prompt): >From b760546c59d1b9982296c19f8eaea6dc225b5a4f Mon Sep 17 00:00:00 2001 From: Sven Strickroth <email@xxxxxxxxxx> Date: Tue, 27 Dec 2011 00:33:46 +0100 Subject: [PATCH 1/4] add central method for prompting a user using GIT_ASKPASS or SSH_ASKPASS Signed-off-by: Sven Strickroth <email@xxxxxxxxxx> --- perl/Git.pm | 31 ++++++++++++++++++++++++++++++- 1 files changed, 30 insertions(+), 1 deletions(-) diff --git a/perl/Git.pm b/perl/Git.pm index f7ce511..8176d47 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 + remote_refs prompt temp_acquire temp_release temp_reset temp_path); @@ -512,6 +512,35 @@ C<git --html-path>). Useful mostly only internally. sub html_path { command_oneline('--html-path') } +=item prompt ( PROMPT) + +Checks if GIT_ASKPASS or SSH_ASKPASS is set, and if yes +use it and return answer from user. + +=cut + +sub prompt { + my ($self, $prompt) = _maybe_self(@_); + if (exists $ENV{'GIT_ASKPASS'}) { + return _prompt($ENV{'GIT_ASKPASS'}, $prompt); + } elsif (exists $ENV{'SSH_ASKPASS'}) { + return _prompt($ENV{'SSH_ASKPASS'}, $prompt); + } else { + return undef; + } +} + +sub _prompt { + my ($self, $askpass, $prompt) = _maybe_self(@_); + my $ret; + open(PH, "-|", $askpass, $prompt); + $ret = <PH>; + $ret =~ s/[\012\015]//g; # strip \n\r + close(PH); + return $ret; +} + + =item repo_path () Return path to the git repository. Must be called on a repository instance. -- 1.7.7.1.msysgit.0 >From ef4c6557d1b0e33440d13c64742d44b2a22143f3 Mon Sep 17 00:00:00 2001 From: Sven Strickroth <email@xxxxxxxxxx> Date: Tue, 27 Dec 2011 00:34:09 +0100 Subject: [PATCH 2/4] switch to central prompt method Signed-off-by: Sven Strickroth <email@xxxxxxxxxx> --- git-svn.perl | 9 ++------- 1 files changed, 2 insertions(+), 7 deletions(-) diff --git a/git-svn.perl b/git-svn.perl index eeb83d3..4fd4eca 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -4415,13 +4415,8 @@ sub username { sub _read_password { my ($prompt, $realm) = @_; - my $password = ''; - if (exists $ENV{GIT_ASKPASS}) { - open(PH, "-|", $ENV{GIT_ASKPASS}, $prompt); - $password = <PH>; - $password =~ s/[\012\015]//; # \n\r - close(PH); - } else { + my $password = Git->prompt($prompt);; + if (!defined $password) { print STDERR $prompt; STDERR->flush; require Term::ReadKey; -- 1.7.7.1.msysgit.0 >From d58f41d7b9b8e690c9839f6f7539774da88aa3a4 Mon Sep 17 00:00:00 2001 From: Sven Strickroth <email@xxxxxxxxxx> Date: Tue, 27 Dec 2011 00:37:43 +0100 Subject: [PATCH 3/4] honour *_ASKPASS for querying username and for querying further actions on unknown certificates git-svn reads usernames (and answers for certificate errors) from an interactive terminal. This behavior cause GUIs to hang waiting for git-svn to complete (http://code.google.com/p/tortoisegit/issues/detail?id=967). Also see commit 56a853b62c0ae7ebaad0a7a0a704f5ef561eb795. Signed-off-by: Sven Strickroth <email@xxxxxxxxxx> --- git-svn.perl | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-) diff --git a/git-svn.perl b/git-svn.perl index 4fd4eca..b85a7de 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -4357,11 +4357,15 @@ sub ssl_server_trust { 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)); + $choice = Git->prompt("Certificate unknown. " . $options); + if (!defined $choice) { + print STDERR $options; + STDERR->flush; + $choice = lc(substr(<STDIN> || 'R', 0, 1)); + } if ($choice =~ /^t$/i) { $cred->may_save(undef); } elsif ($choice =~ /^r$/i) { @@ -4404,6 +4408,9 @@ sub username { if (defined $_username) { $username = $_username; } else { + $username = Git->prompt("Username"); + } + if (!defined $username) { print STDERR "Username: "; STDERR->flush; chomp($username = <STDIN>); -- 1.7.7.1.msysgit.0 >From 2c1dbdae8024f28d17abfbdc7e45865a1277151a Mon Sep 17 00:00:00 2001 From: Sven Strickroth <email@xxxxxxxxxx> Date: Tue, 27 Dec 2011 00:42:07 +0100 Subject: [PATCH 4/4] ignore empty *_ASKPASS variables Signed-off-by: Sven Strickroth <email@xxxxxxxxxx> --- perl/Git.pm | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/perl/Git.pm b/perl/Git.pm index 8176d47..fade617 100644 --- a/perl/Git.pm +++ b/perl/Git.pm @@ -532,6 +532,9 @@ sub prompt { sub _prompt { my ($self, $askpass, $prompt) = _maybe_self(@_); + unless ($askpass) { + return undef; + } my $ret; open(PH, "-|", $askpass, $prompt); $ret = <PH>; -- 1.7.7.1.msysgit.0 -- 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