All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sven Strickroth <sven.strickroth@tu-clausthal.de>
To: Junio C Hamano <gitster@pobox.com>
Cc: Jeff King <peff@peff.net>,
	git@vger.kernel.org, Jakub Narebski <jnareb@gmail.com>
Subject: Re: [PATCH 2/2] git-svn, perl/Git.pm: extend and use Git->prompt method for querying users
Date: Sun, 01 Jan 2012 21:55:59 +0100	[thread overview]
Message-ID: <4F00C85F.7060401@tu-clausthal.de> (raw)
In-Reply-To: <4F00BAA6.9050104@tu-clausthal.de>

Following you can find my first proposal, based upon patch 1. It's only the
perl part, because I haven't checked out Peffs git_prompt patch(es) and to
avoid double work.

ATM I'm unsure about the 'username' type, but I think it's quite necessary
to make git-svn behave like git-core in case of asking for a username. A type
'userpass' (username and password in one dialog) isn't mentioned here, because
it's not necessary for the git-svn part, but we should also specify/document it
if we want to use it in the future.

Btw. happy new year! ;)

---
 git-svn.perl |   24 +++++++------------
 perl/Git.pm  |   70 ++++++++++++++++++++++++++++++++++++++++-----------------
 2 files changed, 58 insertions(+), 36 deletions(-)

diff --git a/git-svn.perl b/git-svn.perl
index 26d3559..54cf77f 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 $prompt = $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($prompt) || '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;
@@ -4378,10 +4377,7 @@ prompt:
 sub ssl_client_cert {
 	my ($cred, $realm, $may_save, $pool) = @_;
 	$may_save = undef if $_no_auth_cache;
-	print STDERR "Client certificate filename: ";
-	STDERR->flush;
-	chomp(my $filename = <STDIN>);
-	$cred->cert_file($filename);
+	$cred->cert_file(Git->prompt("Client certificate filename: ", 'filename'));
 	$cred->may_save($may_save);
 	$SVN::_Core::SVN_NO_ERROR;
 }
@@ -4404,9 +4400,7 @@ sub username {
 	if (defined $_username) {
 		$username = $_username;
 	} else {
-		print STDERR "Username: ";
-		STDERR->flush;
-		chomp($username = <STDIN>);
+		$username = Git->prompt("Username: ", 'username');
 	}
 	$cred->username($username);
 	$cred->may_save($may_save);
@@ -4415,7 +4409,7 @@ sub username {

 sub _read_password {
 	my ($prompt, $realm) = @_;
-	my $password = Git->prompt($prompt);
+	my $password = Git->prompt($prompt, 'pass');
 	$password;
 }

diff --git a/perl/Git.pm b/perl/Git.pm
index ba9a5f2..17ddf40 100644
--- a/perl/Git.pm
+++ b/perl/Git.pm
@@ -512,52 +512,80 @@ C<git --html-path>). Useful mostly only internally.
 sub html_path { command_oneline('--html-path') }


-=item prompt ( PROMPT )
+=item prompt ( PROMPT , TYPE )

 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 an external helper is specified via GIT_DIALOG, 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.
+
+Possible values for C<TYPE>:
+- '' or 'text': prompt for normal text (only GIT_DIALOG)
+- 'username': prompt for username (behaves exactly as 'text', but also
+              uses *_ASKPASS)
+- 'pass': prompt for password, echoing of what is typed is disabled on
+          the terminal, GUI tool shows asterisks.
+- 'filename': prompt for a filename, GUI tool migh provide file chooser
+              (only GIT_DIALOG)

 =cut

 sub prompt {
-	my ($self, $prompt) = _maybe_self(@_);
+	my ($self, $prompt, $type) = _maybe_self(@_);
+	$type = 'text' unless ($type);
+	my $useAskPass = ($type eq 'pass' || $type eq 'username');
 	my $ret;
 	if (!defined $ret) {
-		$ret = _prompt($ENV{'GIT_ASKPASS'}, $prompt);
+		$ret = _promptgitdialog($ENV{'GIT_DIALOG'}, $prompt, $type);
 	}
-	if (!defined $ret) {
-		$ret = _prompt($ENV{'SSH_ASKPASS'}, $prompt);
+	if ($useAskPass && !defined $ret) {
+		$ret = _promptaskpass($ENV{'GIT_ASKPASS'}, $prompt);
+	}
+	if ($useAskPass && !defined $ret) {
+		$ret = _promptaskpass($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 ($type eq 'pass') {
+			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;
 }

-sub _prompt {
+sub _promptgitdialog {
+	my ($gitdialog, $prompt, $type) = @_;
+	return undef unless ($askpass);
+	my $ret;
+	open my $fh, "-|", $gitdialog, $type, $prompt
+		or return undef;
+	$ret = <$fh>;
+	$ret =~ s/\r?\n$//; # strip \r\n, chomp does not work on all systems (i.e. windows) as expected
+	close ($fh);
+	return $ret;
+}
+
+sub _promptaskpass {
 	my ($askpass, $prompt) = @_;
-	unless ($askpass) {
-		return undef;
-	}
+	return undef unless ($askpass);
 	my $ret;
 	open my $fh, "-|", $askpass, $prompt
 		or return undef;
 	$ret = <$fh>;
-	$ret =~ s/[\012\015]//g; # \n\r
+	$ret =~ s/\r?\n$//; # strip \r\n, chomp does not work on all systems (i.e. windows) as expected
 	close ($fh);
 	return $ret;
 }
-- 

-- 
Best regards,
 Sven Strickroth
 ClamAV, a GPL anti-virus toolkit   http://www.clamav.net
 PGP key id F5A9D4C4 @ any key-server

  reply	other threads:[~2012-01-01 20:56 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-17 15:15 [PATCH] honour GIT_ASKPASS for querying username in git-svn Sven Strickroth
2011-11-18 11:36 ` Erik Faye-Lund
2011-11-18 13:30   ` Sven Strickroth
2011-11-18 14:19     ` Erik Faye-Lund
2011-11-26 11:33       ` Sven Strickroth
2011-11-30  6:44         ` Jeff King
2011-12-26 23:49           ` Sven Strickroth
2011-12-27 14:33             ` Jakub Narebski
2011-12-27 14:39               ` Sven Strickroth
2011-12-27 16:00                 ` Jakub Narebski
2011-12-27 16:01                 ` [PATCH 0/5] honour *_ASKPASS for querying user " Sven Strickroth
2011-12-27 16:05                   ` [PATCH 1/5] add central method for prompting a user using GIT_ASKPASS or SSH_ASKPASS Sven Strickroth
2011-12-27 20:47                     ` Junio C Hamano
2011-12-27 23:12                       ` Thomas Adam
2011-12-27 23:35                         ` Junio C Hamano
2011-12-27 16:06                   ` [PATCH 2/5] switch to central prompt method Sven Strickroth
2011-12-27 20:47                     ` Junio C Hamano
2011-12-27 16:07                   ` [PATCH 3/5] honour *_ASKPASS for querying username and for querying further actions like unknown certificates Sven Strickroth
2011-12-27 20:56                     ` Junio C Hamano
2011-12-27 16:07                   ` [PATCH 4/5] ignore empty *_ASKPASS variables Sven Strickroth
2011-12-27 21:00                     ` Junio C Hamano
2011-12-27 16:07                   ` [PATCH 5/5] make askpass_prompt a global prompt method for asking users Sven Strickroth
2011-12-27 21:10                     ` Junio C Hamano
2011-12-27 21:41                       ` Junio C Hamano
2011-12-28  0:11                         ` [PATCH 1/2] git-svn, perl/Git.pm: add central method for prompting passwords honoring GIT_ASKPASS and SSH_ASKPASS Sven Strickroth
2011-12-28  2:34                           ` Junio C Hamano
2011-12-28 16:17                             ` Sven Strickroth
2011-12-28 18:56                             ` Jakub Narebski
2012-01-03 10:17                           ` Ævar Arnfjörð Bjarmason
2012-01-03 10:25                             ` Sven Strickroth
2012-01-03 12:03                               ` Ævar Arnfjörð Bjarmason
2012-01-03 12:06                                 ` Ævar Arnfjörð Bjarmason
2012-01-03 13:18                                 ` Sven Strickroth
2012-01-03 19:42                                 ` Junio C Hamano
2012-01-03 22:51                             ` Junio C Hamano
2012-01-03 23:27                               ` Sven Strickroth
2012-01-04  0:10                                 ` Junio C Hamano
2012-01-04  7:55                                   ` Sven Strickroth
2012-01-04  8:31                                     ` Sven Strickroth
2012-01-04 13:34                                       ` Jeff King
2012-01-04 14:13                                         ` Sven Strickroth
2012-01-04 19:08                                       ` Junio C Hamano
2012-01-07  4:27                                         ` Sven Strickroth
2012-01-04 18:58                                     ` Junio C Hamano
2012-01-04 19:20                                       ` Sven Strickroth
2011-12-28  0:12                         ` [PATCH 2/2] git-svn, perl/Git.pm: extend and use Git->prompt method for querying users Sven Strickroth
2011-12-28  2:41                           ` Junio C Hamano
2011-12-28 10:41                             ` Sven Strickroth
2011-12-28 21:00                               ` Junio C Hamano
2011-12-28 21:38                                 ` Junio C Hamano
2011-12-28 21:47                                   ` Sven Strickroth
2011-12-28 22:29                                     ` Junio C Hamano
2011-12-30  4:40                                       ` Sven Strickroth
2011-12-30 13:54                                         ` Jeff King
2011-12-30 14:53                                           ` Sven Strickroth
2012-01-01  9:11                                             ` Junio C Hamano
2012-01-01 19:57                                               ` Sven Strickroth
2012-01-01 20:55                                                 ` Sven Strickroth [this message]
2012-01-01 19:45                                   ` Sven Strickroth
2012-01-03 18:19                                     ` Junio C Hamano
2012-01-03 18:40                                       ` Jeff King
2012-02-12 16:02                                         ` Sven Strickroth
2012-02-12 16:11                                           ` Jakub Narebski
2012-02-12 16:26                                             ` Sven Strickroth
2012-02-14 22:20                                               ` Jeff King
2012-02-14 22:35                                                 ` Junio C Hamano
2012-02-14 22:47                                                   ` Jeff King
2012-01-03 23:24                                       ` Sven Strickroth
2012-01-04  0:12                                         ` Junio C Hamano
2012-10-06 15:18                                           ` Sven Strickroth
2012-10-06 18:28                                             ` Junio C Hamano
2012-11-11 16:40                                               ` [PATCH 0/2] second try Sven Strickroth
2012-11-24 19:07                                                 ` Sven Strickroth
2012-11-26  4:50                                                   ` Junio C Hamano
2012-12-17 15:54                                                     ` Sven Strickroth
2012-12-17 20:08                                                       ` Junio C Hamano
2012-12-18  0:28                                                         ` [PATCH 1/3] git-svn, perl/Git.pm: add central method for prompting passwords Sven Strickroth
2012-12-18  0:28                                                         ` [PATCH 2/3] perl/Git.pm: Honor SSH_ASKPASS as fallback if GIT_ASKPASS is not set Sven Strickroth
2012-12-18  0:57                                                           ` Jeff King
2012-12-18  0:28                                                         ` [PATCH 3/3] git-svn, perl/Git.pm: extend and use Git->prompt method for querying users Sven Strickroth
2012-11-11 16:40                                               ` [PATCH 1/2] git-svn, perl/Git.pm: add central method for prompting passwords honoring GIT_ASKPASS and SSH_ASKPASS Sven Strickroth
2012-11-11 16:41                                               ` [PATCH 2/2] git-svn, perl/Git.pm: extend and use Git->prompt method for querying users Sven Strickroth

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4F00C85F.7060401@tu-clausthal.de \
    --to=sven.strickroth@tu-clausthal.de \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jnareb@gmail.com \
    --cc=peff@peff.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.