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
next prev parent 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
List information: http://vger.kernel.org/majordomo-info.html
* 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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).