read_key_without_echo() reads from stdin but uses /dev/tty when it
disables echo. This is unfortunate as there no guarantee that stdin is
the same device as /dev/tty. The perl version of "add -p" uses stdin
when it sets the terminal mode, this commit does the same for the
builtin version. There is still a difference between the perl and
builtin versions though - the perl version will ignore any errors when
setting the terminal mode[1] and will still read single bytes when
stdin is not a terminal. The builtin version displays a warning if
setting the terminal mode fails and switches to reading a line at a
time.
[1] b061c913bb/ReadKey.xs (L1090)
Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
		
	
		
			
				
	
	
		
			28 lines
		
	
	
		
			875 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			28 lines
		
	
	
		
			875 B
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef COMPAT_TERMINAL_H
 | 
						|
#define COMPAT_TERMINAL_H
 | 
						|
 | 
						|
enum save_term_flags {
 | 
						|
	/* Save input and output settings */
 | 
						|
	SAVE_TERM_DUPLEX = 1 << 0,
 | 
						|
	/* Save stdin rather than /dev/tty (fails if stdin is not a terminal) */
 | 
						|
	SAVE_TERM_STDIN  = 1 << 1,
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 * Save the terminal attributes so they can be restored later by a
 | 
						|
 * call to restore_term(). Note that every successful call to
 | 
						|
 * save_term() must be matched by a call to restore_term() even if the
 | 
						|
 * attributes have not been changed. Returns 0 on success, -1 on
 | 
						|
 * failure.
 | 
						|
 */
 | 
						|
int save_term(enum save_term_flags flags);
 | 
						|
/* Restore the terminal attributes that were saved with save_term() */
 | 
						|
void restore_term(void);
 | 
						|
 | 
						|
char *git_terminal_prompt(const char *prompt, int echo);
 | 
						|
 | 
						|
/* Read a single keystroke, without echoing it to the terminal */
 | 
						|
int read_key_without_echo(struct strbuf *buf);
 | 
						|
 | 
						|
#endif /* COMPAT_TERMINAL_H */
 |