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