refactor git_getpass into generic prompt function
authorJeff King <peff@peff.net>
Sat, 10 Dec 2011 10:40:57 +0000 (05:40 -0500)
committerJunio C Hamano <gitster@pobox.com>
Tue, 13 Dec 2011 00:09:38 +0000 (16:09 -0800)
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>
prompt.c
prompt.h
index 42a1c9f9fb459c033246d33e8b7f65f0ab5da68f..20026444c018d0358d6dfbeecb23df3f021bc4ce 100644 (file)
--- 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 @@ 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 +33,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 = 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);
+}
index 0fd7bd997a69115c47aa13c973fca6ac54450285..9ab85a78a24db86283f22168db61e51d5ef87546 100644 (file)
--- 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 */