diff options
Diffstat (limited to 'third_party/git/prompt.c')
-rw-r--r-- | third_party/git/prompt.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/third_party/git/prompt.c b/third_party/git/prompt.c new file mode 100644 index 000000000000..6d5885d00964 --- /dev/null +++ b/third_party/git/prompt.c @@ -0,0 +1,76 @@ +#include "cache.h" +#include "config.h" +#include "run-command.h" +#include "strbuf.h" +#include "prompt.h" +#include "compat/terminal.h" + +static char *do_askpass(const char *cmd, const char *prompt) +{ + struct child_process pass = CHILD_PROCESS_INIT; + const char *args[3]; + static struct strbuf buffer = STRBUF_INIT; + int err = 0; + + args[0] = cmd; + args[1] = prompt; + args[2] = NULL; + + pass.argv = args; + pass.out = -1; + + if (start_command(&pass)) + return NULL; + + strbuf_reset(&buffer); + if (strbuf_read(&buffer, pass.out, 20) < 0) + err = 1; + + close(pass.out); + + if (finish_command(&pass)) + err = 1; + + if (err) { + error("unable to read askpass response from '%s'", cmd); + strbuf_release(&buffer); + return NULL; + } + + strbuf_setlen(&buffer, strcspn(buffer.buf, "\r\n")); + + return buffer.buf; +} + +char *git_prompt(const char *prompt, int flags) +{ + char *r = NULL; + + 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) + r = do_askpass(askpass, prompt); + } + + if (!r) { + const char *err; + + if (git_env_bool("GIT_TERMINAL_PROMPT", 1)) { + r = git_terminal_prompt(prompt, flags & PROMPT_ECHO); + err = strerror(errno); + } else { + err = "terminal prompts disabled"; + } + if (!r) { + /* prompts already contain ": " at the end */ + die("could not read %s%s", prompt, err); + } + } + return r; +} |