Merge branch 'maint'
[gitweb.git] / prompt.c
index 42a1c9f9fb459c033246d33e8b7f65f0ab5da68f..72ab9de2f94be30eef9e41ced97580f7de48e0fc 100644 (file)
--- a/prompt.c
+++ b/prompt.c
@@ -2,27 +2,15 @@
 #include "run-command.h"
 #include "strbuf.h"
 #include "prompt.h"
+#include "compat/terminal.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 +23,7 @@ char *git_getpass(const char *prompt)
 
        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 +34,30 @@ char *git_getpass(const char *prompt)
 
        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 = git_terminal_prompt(prompt, flags & PROMPT_ECHO);
+       if (!r)
+               die_errno("could not read '%s'", prompt);
+       return r;
+}
+
+char *git_getpass(const char *prompt)
+{
+       return git_prompt(prompt, PROMPT_ASKPASS);
+}