Skip to content

Commit 3fd8816

Browse files
kbleesdscho
authored andcommitted
compat/terminal.c: only use the Windows console if bash 'read -r' fails
Accessing the Windows console through the special CONIN$ / CONOUT$ devices doesn't work properly for non-ASCII usernames an passwords. It also doesn't work for terminal emulators that hide the native console window (such as mintty), and 'TERM=xterm*' is not necessarily a reliable indicator for such terminals. The new shell_prompt() function, on the other hand, works fine for both MSys1 and MSys2, in native console windows as well as mintty, and properly supports Unicode. It just needs bash on the path (for 'read -s', which is bash-specific). On Windows, try to use the shell to read from the terminal. If that fails with ENOENT (i.e. bash was not found), use CONIN/OUT as fallback. Note: To test this, create a UTF-8 credential file with non-ASCII chars, e.g. in git-bash: 'echo url=http://täst.com > cred.txt'. Then in git-cmd, 'git credential fill <cred.txt' works (shell version), while calling git without the git-wrapper (i.e. 'mingw64\bin\git credential fill <cred.txt') mangles non-ASCII chars in both console output and input. Signed-off-by: Karsten Blees <[email protected]>
1 parent b4117bd commit 3fd8816

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed

compat/terminal.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ static char *shell_prompt(const char *prompt, int echo)
244244
strvec_pushv(&child.args, read_input);
245245
child.in = -1;
246246
child.out = -1;
247+
child.silent_exec_failure = 1;
247248

248249
if (start_command(&child))
249250
return NULL;
@@ -287,11 +288,14 @@ char *git_terminal_prompt(const char *prompt, int echo)
287288
static struct strbuf buf = STRBUF_INIT;
288289
int r;
289290
FILE *input_fh, *output_fh;
291+
290292
#ifdef GIT_WINDOWS_NATIVE
291-
const char *term = getenv("TERM");
292293

293-
if (term && starts_with(term, "xterm"))
294-
return shell_prompt(prompt, echo);
294+
/* try shell_prompt first, fall back to CONIN/OUT if bash is missing */
295+
char *result = shell_prompt(prompt, echo);
296+
if (result || errno != ENOENT)
297+
return result;
298+
295299
#endif
296300

297301
input_fh = fopen(INPUT_PATH, "r" FORCE_TEXT);

0 commit comments

Comments
 (0)