refactor git_getpass into generic prompt function
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> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
d3c58b83ae
commit
1cb0134f34
46
prompt.c
46
prompt.c
@ -3,26 +3,13 @@
|
|||||||
#include "strbuf.h"
|
#include "strbuf.h"
|
||||||
#include "prompt.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;
|
struct child_process pass;
|
||||||
const char *args[3];
|
const char *args[3];
|
||||||
static struct strbuf buffer = STRBUF_INIT;
|
static struct strbuf buffer = STRBUF_INIT;
|
||||||
|
|
||||||
askpass = getenv("GIT_ASKPASS");
|
args[0] = cmd;
|
||||||
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[1] = prompt;
|
args[1] = prompt;
|
||||||
args[2] = NULL;
|
args[2] = NULL;
|
||||||
|
|
||||||
@ -35,7 +22,7 @@ char *git_getpass(const char *prompt)
|
|||||||
|
|
||||||
strbuf_reset(&buffer);
|
strbuf_reset(&buffer);
|
||||||
if (strbuf_read(&buffer, pass.out, 20) < 0)
|
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);
|
close(pass.out);
|
||||||
|
|
||||||
@ -46,3 +33,30 @@ char *git_getpass(const char *prompt)
|
|||||||
|
|
||||||
return buffer.buf;
|
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);
|
||||||
|
}
|
||||||
|
3
prompt.h
3
prompt.h
@ -1,6 +1,9 @@
|
|||||||
#ifndef PROMPT_H
|
#ifndef PROMPT_H
|
||||||
#define PROMPT_H
|
#define PROMPT_H
|
||||||
|
|
||||||
|
#define PROMPT_ASKPASS (1<<0)
|
||||||
|
|
||||||
|
char *git_prompt(const char *prompt, int flags);
|
||||||
char *git_getpass(const char *prompt);
|
char *git_getpass(const char *prompt);
|
||||||
|
|
||||||
#endif /* PROMPT_H */
|
#endif /* PROMPT_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user