From: Jeff King <peff@peff.net>
To: git@vger.kernel.org
Cc: Erik Faye-Lund <kusmabite@gmail.com>, Junio C Hamano <gitster@pobox.com>
Subject: [PATCH 4/7] refactor git_getpass into generic prompt function
Date: Thu, 8 Dec 2011 03:31:33 -0500 [thread overview]
Message-ID: <20111208083133.GD26409@sigill.intra.peff.net> (raw)
In-Reply-To: <20111208082118.GA1507@sigill.intra.peff.net>
This will allow callers to specify more options (e.g.,
leaving echo on). The original git_getpass becomes a slim
wrapper around the new function.
Signed-off-by: Jeff King <peff@peff.net>
---
Similar to patch 2 from the previous series. Two big differences:
1. The first series accidentally dropped the "die if we don't get a
password" behavior during the refactor, but we want to keep it.
2. The first series had a special "name" parameter just for generating
error messages. This drops it in the name of simplicity, so error
messages have gone from (assuming you don't have a tty):
Could not read password: No such device or address
to:
Could not read 'Username for 'https://example.com': ': No such
device or address
which is verbose, yes, but contains a little more useful
information. The formatting is rather unfortunate, but I don't think
it's worth worrying too much about.
prompt.c | 46 ++++++++++++++++++++++++++++++----------------
prompt.h | 3 +++
2 files changed, 33 insertions(+), 16 deletions(-)
diff --git a/prompt.c b/prompt.c
index 42a1c9f..2002644 100644
--- a/prompt.c
+++ b/prompt.c
@@ -3,26 +3,13 @@
#include "strbuf.h"
#include "prompt.h"
-char *git_getpass(const char *prompt)
+static char *do_askpass(const char *cmd, const char *prompt)
{
- const char *askpass;
struct child_process pass;
const char *args[3];
static struct strbuf buffer = STRBUF_INIT;
- askpass = getenv("GIT_ASKPASS");
- if (!askpass)
- askpass = askpass_program;
- if (!askpass)
- askpass = getenv("SSH_ASKPASS");
- if (!askpass || !(*askpass)) {
- char *result = getpass(prompt);
- if (!result)
- die_errno("Could not read password");
- return result;
- }
-
- args[0] = askpass;
+ args[0] = cmd;
args[1] = prompt;
args[2] = NULL;
@@ -35,7 +22,7 @@
strbuf_reset(&buffer);
if (strbuf_read(&buffer, pass.out, 20) < 0)
- die("failed to read password from %s\n", askpass);
+ die("failed to get '%s' from %s\n", prompt, cmd);
close(pass.out);
@@ -46,3 +33,30 @@
return buffer.buf;
}
+
+char *git_prompt(const char *prompt, int flags)
+{
+ char *r;
+
+ if (flags & PROMPT_ASKPASS) {
+ const char *askpass;
+
+ askpass = getenv("GIT_ASKPASS");
+ if (!askpass)
+ askpass = askpass_program;
+ if (!askpass)
+ askpass = getenv("SSH_ASKPASS");
+ if (askpass && *askpass)
+ return do_askpass(askpass, prompt);
+ }
+
+ r = getpass(prompt);
+ if (!r)
+ die_errno("could not read '%s'", prompt);
+ return r;
+}
+
+char *git_getpass(const char *prompt)
+{
+ return git_prompt(prompt, PROMPT_ASKPASS);
+}
diff --git a/prompt.h b/prompt.h
index 0fd7bd9..9ab85a7 100644
--- a/prompt.h
+++ b/prompt.h
@@ -1,6 +1,9 @@
#ifndef PROMPT_H
#define PROMPT_H
+#define PROMPT_ASKPASS (1<<0)
+
+char *git_prompt(const char *prompt, int flags);
char *git_getpass(const char *prompt);
#endif /* PROMPT_H */
--
1.7.8.rc2.8.gf0f4f
next prev parent reply other threads:[~2011-12-08 8:31 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-08 8:21 [PATCHv2 0/7] getpass refactoring Jeff King
2011-12-08 8:23 ` [PATCH 1/7] imap-send: avoid buffer overflow Jeff King
2011-12-08 8:24 ` [PATCH 2/7] imap-send: don't check return value of git_getpass Jeff King
2011-12-08 8:24 ` [PATCH 3/7] move git_getpass to its own source file Jeff King
2011-12-08 8:31 ` Jeff King [this message]
2011-12-09 23:58 ` [PATCH 4/7] refactor git_getpass into generic prompt function Junio C Hamano
2011-12-08 8:33 ` [PATCH 5/7] add generic terminal " Jeff King
2011-12-08 21:48 ` Jakub Narebski
2011-12-08 21:52 ` Jeff King
2011-12-08 8:33 ` [PATCH 6/7] prompt: use git_terminal_prompt Jeff King
2011-12-08 8:33 ` [PATCH 7/7] credential: use git_prompt instead of git_getpass Jeff King
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=20111208083133.GD26409@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=kusmabite@gmail.com \
/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).