[PATCH 2/6] refactor git_getpass into generic prompt function
- From
Jeff King <peff@peff.net>
- Date
- Nov 27, 2011, 08:29 UTC
- Message-ID
- <20111127082932.GB1702@sigill.intra.peff.net>
- In-Reply-To
- <20111127082744.GA32068@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> --- Making askpass optional isn't necessary for this series, but splitting it actually makes the code a little cleaner, imho, and some callers might eventually want to turn it off.
prompt.c | 41 +++++++++++++++++++++++++---------------- prompt.h | 3 +++ 2 files changed, 28 insertions(+), 16 deletions(-)
diff --git a/prompt.c b/prompt.c index 42a1c9f..7c8f9aa 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 *name) { - 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 read %s from %s\n", name, cmd); close(pass.out); @@ -46,3 +33,25 @@ return buffer.buf; } + +char *git_prompt(const char *prompt, const char *name, int flags) +{ + 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, name); + } + + return getpass(prompt); +} + +char *git_getpass(const char *prompt) +{ + return git_prompt(prompt, "password", PROMPT_ASKPASS); +} diff --git a/prompt.h b/prompt.h index 0fd7bd9..18868c2 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, const char *name, int flags); char *git_getpass(const char *prompt); #endif /* PROMPT_H */
-- 1.7.7.4.7.g24824