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 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.