From: Jakub Narebski <jnareb@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Sven Strickroth <sven.strickroth@tu-clausthal.de>,
git@vger.kernel.org, Jeff King <peff@peff.net>
Subject: Re: [PATCH 1/2] git-svn, perl/Git.pm: add central method for prompting passwords honoring GIT_ASKPASS and SSH_ASKPASS
Date: Wed, 28 Dec 2011 19:56:29 +0100 [thread overview]
Message-ID: <201112281956.30289.jnareb@gmail.com> (raw)
In-Reply-To: <7vboqt2zm4.fsf@alter.siamese.dyndns.org>
Junio C Hamano wrote:
> Sven Strickroth <sven.strickroth@tu-clausthal.de> writes:
> I only have a few minor nits, and request for extra set of eyeballs from
> Perl-y people.
>
> > 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
> > - ...
> > - while (defined(my $key = Term::ReadKey::ReadKey(0))) {
> > - last if $key =~ /[\012\015]/; # \n\r
> > - $password .= $key;
> > - }
> > - ...
> > + my $password = Git->prompt($prompt);
> > $password;
> > }
> > ...
> > +Check if GIT_ASKPASS or SSH_ASKPASS is set, use first matching for querying
> > +user and return answer. If no *_ASKPASS variable is set, the variable is
> > +empty or an error occoured, the terminal is tried as a fallback.
>
> Looks like a description that is correct, but I feel a slight hiccup when
> trying to read the first sentence aloud. Perhaps other reviewers on the
> list can offer an easier to read alternative?
Perhaps
Query user for password with given PROMPT and return answer. It respects
GIT_ASKPASS and SSH_ASKPASS environment variables, with terminal in a
password mode (no echo) as a fallback. Returns undef if it cannot ask
for password.
> > +sub prompt {
> > + my ($self, $prompt) = _maybe_self(@_);
> > + my $ret;
> > + if (exists $ENV{'GIT_ASKPASS'}) {
Wouldn't it be simpler and more resilent to just check for $ENV{'GIT_ASKPASS'}?
Assuming that nobody uses command named '0' it would cover both GIT_ASKPASS
not being set (!exists) and being set to empty value (eq '').
> > + $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;
> > + require Term::ReadKey;
> > + Term::ReadKey::ReadMode('noecho');
> > + while (defined(my $key = Term::ReadKey::ReadKey(0))) {
> > + last if $key =~ /[\012\015]/; # \n\r
> > + $ret .= $key;
I wonder if the last part wouldn't be better to be refactored into
a separate subroutine, e.g. _prompt_readkey.
>
> Unlike the original in _read_password, $ret ($password over there) is left
> "undef" here; I am wondering if "$ret .= $key" might trigger a warning and
> if that is the case, probably we should have an explicit "$ret = '';"
> before going into the while loop.
No that is not a problem. In Perl undefined variable functions as 0 in
numeric context ($foo++), as '' in string context ($foo .= $key), and []
in arrayref context (push @$foo, $key).
> > +sub _prompt {
> > + my ($askpass, $prompt) = @_;
> > + unless ($askpass) {
> > + return undef;
> > + }
>
> Perl gurus on the list might prefer to rewrite this with statement
> modifier as "return undef unless (...);" but I am not one of them.
>
> > + my $ret;
> > + open my $fh, "-|", $askpass, $prompt || return undef;
>
> I am so used see this spelled with the lower-precedence "or" like this
>
> open my $fh, "-|", $askpass, $prompt
> or return undef;
>
> that I am no longer sure if the use of "||" is Ok here. Help from Perl
> gurus on the list?
It is incorrect, which you can check with B::Deparse.
$ perl -MO=Deparse,-p -e 'open my $fh, "-|", $askpass, $prompt || return undef;'
open(my $fh, '-|', $askpass, ($prompt || return(undef)));
Anyway, wouldn't it be simpler and better to use command_oneline or its
backend here?
> > + $ret = <$fh>;
> > + $ret =~ s/[\012\015]//g; # strip \n\r, chomp does not work on all systems (i.e. windows) as expected
>
> The original reads one line from the helper process, removes the first \n
> or \r (expecting there is only one), and returns the result. The new code
> reads one line, removes all \n and \r everywhere, and returns the result.
>
> I do not think it makes any difference in practice, but shouldn't this
> logically be more like "s/\r?\n$//", that is "remove the CRLF or LF at the
> end"?
>
> > + close ($fh);
>
> It seems that we aquired a SP after "close" compared to the
> original. What's the prevailing coding style in our Perl code?
>
> This close() of pipe to the subprocess is where a lot of error checking
> happens, no? Can this return an error?
>
> I can see the original ignored an error condition, but do we care, or not
> care?
If we use command_oneline or its backend we wouldn't have to worry
about this.
--
Jakub Narebski
Poland
next prev parent reply other threads:[~2011-12-28 18: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 [this message]
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
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=201112281956.30289.jnareb@gmail.com \
--to=jnareb@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=peff@peff.net \
--cc=sven.strickroth@tu-clausthal.de \
/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 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 NNTP newsgroup(s).