🌐 AI搜索 & 代理 主页
blob: 75406390c6fdabf74e74d4c2a90e6ac92afc4ccc [file] [log] [blame]
Jeff Kingd3c58b82011-12-10 10:40:541#include "cache.h"
2#include "run-command.h"
3#include "strbuf.h"
4#include "prompt.h"
Jeff Kinga5090252011-12-10 10:41:085#include "compat/terminal.h"
Jeff Kingd3c58b82011-12-10 10:40:546
Jeff King1cb01342011-12-10 10:40:577static char *do_askpass(const char *cmd, const char *prompt)
Jeff Kingd3c58b82011-12-10 10:40:548{
René Scharfed3180272014-08-19 19:09:359 struct child_process pass = CHILD_PROCESS_INIT;
Jeff Kingd3c58b82011-12-10 10:40:5410 const char *args[3];
11 static struct strbuf buffer = STRBUF_INIT;
Jeff King84d72732012-02-03 22:16:0212 int err = 0;
Jeff Kingd3c58b82011-12-10 10:40:5413
Jeff King1cb01342011-12-10 10:40:5714 args[0] = cmd;
Jeff Kingd3c58b82011-12-10 10:40:5415 args[1] = prompt;
16 args[2] = NULL;
17
Jeff Kingd3c58b82011-12-10 10:40:5418 pass.argv = args;
19 pass.out = -1;
20
21 if (start_command(&pass))
Jeff King84d72732012-02-03 22:16:0222 return NULL;
Jeff Kingd3c58b82011-12-10 10:40:5423
Jeff Kinge1c1a322014-01-02 03:03:3024 strbuf_reset(&buffer);
Jeff Kingd3c58b82011-12-10 10:40:5425 if (strbuf_read(&buffer, pass.out, 20) < 0)
Jeff King84d72732012-02-03 22:16:0226 err = 1;
Jeff Kingd3c58b82011-12-10 10:40:5427
28 close(pass.out);
29
30 if (finish_command(&pass))
Jeff King84d72732012-02-03 22:16:0231 err = 1;
32
33 if (err) {
34 error("unable to read askpass response from '%s'", cmd);
35 strbuf_release(&buffer);
36 return NULL;
37 }
Jeff Kingd3c58b82011-12-10 10:40:5438
39 strbuf_setlen(&buffer, strcspn(buffer.buf, "\r\n"));
40
Jeff Kinge1c1a322014-01-02 03:03:3041 return buffer.buf;
Jeff Kingd3c58b82011-12-10 10:40:5442}
Jeff King1cb01342011-12-10 10:40:5743
44char *git_prompt(const char *prompt, int flags)
45{
Jeff King84d72732012-02-03 22:16:0246 char *r = NULL;
Jeff King1cb01342011-12-10 10:40:5747
48 if (flags & PROMPT_ASKPASS) {
49 const char *askpass;
50
51 askpass = getenv("GIT_ASKPASS");
52 if (!askpass)
53 askpass = askpass_program;
54 if (!askpass)
55 askpass = getenv("SSH_ASKPASS");
56 if (askpass && *askpass)
Jeff King84d72732012-02-03 22:16:0257 r = do_askpass(askpass, prompt);
Jeff King1cb01342011-12-10 10:40:5758 }
59
Jeff King84d72732012-02-03 22:16:0260 if (!r) {
Jeff Kinge652c0e2014-12-04 03:52:2961 const char *err;
62
63 if (git_env_bool("GIT_TERMINAL_PROMPT", 1)) {
64 r = git_terminal_prompt(prompt, flags & PROMPT_ECHO);
65 err = strerror(errno);
66 } else {
67 err = "terminal prompts disabled";
68 }
69 if (!r) {
70 /* prompts already contain ": " at the end */
71 die("could not read %s%s", prompt, err);
72 }
Jeff King84d72732012-02-03 22:16:0273 }
Jeff King1cb01342011-12-10 10:40:5774 return r;
75}