A bit of an amusing edge case.
I'm not exactly sure the correct approach to fix this but here's my reproduction, triage, and a few potential options I see.
Note that after the username prompt, I pressed ^D
$./prefix/bin/git --version git version 2.18.0 $ PATH=$PWD/prefix/bin:$PATH git clone https://github.com/asottile/this-does-not-exist-i-promise Cloning into 'this-does-not-exist-i-promise'... Username for 'https://github.com': fatal: could not read Username for 'https://github.com': Success
Looking at `prompt.c`, it's hitting this bit of code:
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);
}From `git_terminal_prompt` (compat/terminal.c):
r = strbuf_getline_lf(&buf, input_fh);
if (!echo) {
putc('\n', output_fh);
fflush(output_fh);
} restore_term();
fclose(input_fh);
fclose(output_fh); if (r == EOF)
return NULL;
return buf.buf;in the `EOF` case, this is returning `NULL`, but `errno = 0` at this point causing the error string to be "Success"
I see a couple of options here:
1. special case EOF in `git_terminal_prompt` / `git_prompt` and produce an error message such as:
fatal: could not read Username for 'https://github.com': EOF
(I tried returing `EOF` directly from `git_terminal_prompt` and was able to get this messaging to work, however `r == EOF` is a pointer-int comparison so this approach didn't really seem like a good idea -- changing the signature of `git_terminal_prompt` to set a special flag for EOF is another option, but seems a lot of work for a case that probably doesn't happen all too often)
I also couldn't find an appropriate errno to set in the EOF case either
2. treat EOF less specially
The function this is replacing, `getpass` simply returns an empty string on `EOF`. This patch would implement that:
diff --git a/compat/terminal.c b/compat/terminal.c index fa13ee672..8bd08108e 100644 --- a/compat/terminal.c +++ b/compat/terminal.c @@ -122,7 +122,7 @@ char *git_terminal_prompt(const char *prompt, int echo) fputs(prompt, output_fh); fflush(output_fh); - r = strbuf_getline_lf(&buf, input_fh); + strbuf_getline_lf(&buf, input_fh); if (!echo) { putc('\n', output_fh); fflush(output_fh); @@ -132,8 +132,6 @@ char *git_terminal_prompt(const char *prompt, int echo) fclose(input_fh); fclose(output_fh); - if (r == EOF) - return NULL; return buf.buf; } however then the output is a bit strange for ^D (note I pressed ^D twice): $ PATH=$PWD/prefix/bin:$PATH git clone https://github.com/asottile/this-does-not-exist-i-promise Cloning into 'this-does-not-exist-i-promise'... Username for 'https://github.com': Password for 'https://github.com': remote: Repository not found. fatal: Authentication failed for 'https://github.com/asottile/this-does-not-exist-i-promise/' Anthony