1
+ #include <inttypes.h>
1
2
#include "git-compat-util.h"
3
+ #include "run-command.h"
2
4
#include "compat/terminal.h"
3
5
#include "sigchain.h"
4
6
#include "strbuf.h"
@@ -91,6 +93,53 @@ static int disable_echo(void)
91
93
return 0 ;
92
94
}
93
95
96
+ static char * xterm_prompt (const char * prompt , int echo )
97
+ {
98
+ const char * env = getenv ("MSYS_TTY_HANDLES" );
99
+ const char * echo_off [] = { "sh" , "-c" , "stty -echo </dev/tty" , NULL };
100
+ const char * echo_on [] = { "sh" , "-c" , "stty echo </dev/tty" , NULL };
101
+ static char buffer [1024 ];
102
+ DWORD len , dummy ;
103
+ size_t tty0 , tty1 , tty2 ;
104
+ HANDLE in_handle , out_handle ;
105
+
106
+ if (!env || 3 != sscanf (env ,
107
+ " %" SCNuPTR " %" SCNuPTR " %" SCNuPTR " " ,
108
+ & tty0 , & tty1 , & tty2 )) {
109
+ warning ("Cannot read from xterm" );
110
+ return NULL ;
111
+ }
112
+
113
+ in_handle = (HANDLE )tty0 ;
114
+ out_handle = (HANDLE )tty1 ;
115
+
116
+ if (!echo && run_command_v_opt (echo_off , 0 ))
117
+ warning ("Could not disable echo on xterm" );
118
+
119
+ if (!WriteFile (out_handle , prompt , strlen (prompt ), & dummy , NULL )) {
120
+ warning ("Could not write to xterm" );
121
+ return NULL ;
122
+ }
123
+
124
+ if (!ReadFile (in_handle , buffer , 1024 , & len , NULL )) {
125
+ warning ("Could not read from xterm" );
126
+ return NULL ;
127
+ }
128
+
129
+ if (len && buffer [len - 1 ] == '\n' )
130
+ buffer [-- len ] = '\0' ;
131
+ if (len && buffer [len - 1 ] == '\r' )
132
+ buffer [-- len ] = '\0' ;
133
+
134
+ if (!echo ) {
135
+ if (run_command_v_opt (echo_on , 0 ))
136
+ warning ("Could not re-enable echo on xterm" );
137
+ WriteFile (out_handle , "\n" , 1 , & dummy , NULL );
138
+ }
139
+
140
+ return len == 0 ? NULL : buffer ;
141
+ }
142
+
94
143
#endif
95
144
96
145
#ifndef FORCE_TEXT
@@ -102,6 +151,12 @@ char *git_terminal_prompt(const char *prompt, int echo)
102
151
static struct strbuf buf = STRBUF_INIT ;
103
152
int r ;
104
153
FILE * input_fh , * output_fh ;
154
+ #ifdef GIT_WINDOWS_NATIVE
155
+ const char * term = getenv ("TERM" );
156
+
157
+ if (term && starts_with (term , "xterm" ))
158
+ return xterm_prompt (prompt , echo );
159
+ #endif
105
160
106
161
input_fh = fopen (INPUT_PATH , "r" FORCE_TEXT );
107
162
if (!input_fh )
0 commit comments