root/prompt.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. do_askpass
  2. git_prompt

#include "cache.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;
}

/* [<][>][^][v][top][bottom][index][help] */