prompt: respect GIT_TERMINAL_PROMPT to disable terminal prompts
authorJeff King <peff@peff.net>
Thu, 4 Dec 2014 03:52:29 +0000 (22:52 -0500)
committerJunio C Hamano <gitster@pobox.com>
Thu, 4 Dec 2014 18:22:42 +0000 (10:22 -0800)
If you run git as part of an automated system, you might
prefer git to die rather than try to issue a prompt on the
terminal (because there would be nobody to see it and
respond, and the process would hang forever).

This usually works out of the box because getpass() (and our
more featureful replacements) will fail when there is no
tty, but this does not cover all cases. For example, a batch
system run via ssh might have a tty, even when the user does
not expect it.

Let's provide an environment variable the user can set to
avoid even trying to touch the tty at all.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git.txt
prompt.c
index 56278451140b49fa13332ebf74f58a6713df2c26..72b6a2df14c115c14cb57dd5bef6bd33ef2d4c5d 100644 (file)
@@ -901,6 +901,10 @@ for further details.
        and read the password from its STDOUT. See also the 'core.askpass'
        option in linkgit:git-config[1].
 
+'GIT_TERMINAL_PROMPT'::
+       If this environment variable is set to `0`, git will not prompt
+       on the terminal (e.g., when asking for HTTP authentication).
+
 'GIT_CONFIG_NOSYSTEM'::
        Whether to skip reading settings from the system-wide
        `$(prefix)/etc/gitconfig` file.  This environment variable can
index d7bb17cb663c2f47ad59d34ecea17c6cc977e815..35ddbfab0cc01899936e8eb4e45e6c7ac8981dd8 100644 (file)
--- a/prompt.c
+++ b/prompt.c
@@ -58,11 +58,19 @@ char *git_prompt(const char *prompt, int flags)
                        r = do_askpass(askpass, prompt);
        }
 
-       if (!r)
-               r = git_terminal_prompt(prompt, flags & PROMPT_ECHO);
        if (!r) {
-               /* prompts already contain ": " at the end */
-               die("could not read %s%s", prompt, strerror(errno));
+               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;
 }