diff options
| -rw-r--r-- | Documentation/config.txt | 7 | ||||
| -rwxr-xr-x | git-add--interactive.perl | 45 | 
2 files changed, 48 insertions, 4 deletions
diff --git a/Documentation/config.txt b/Documentation/config.txt index e2b8775dd3..eeb2b0d353 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -1000,6 +1000,13 @@ instaweb.port::  	The port number to bind the gitweb httpd to. See  	linkgit:git-instaweb[1]. +interactive.singlekey:: +	In interactive programs, allow the user to provide one-letter +	input with a single key (i.e., without hitting enter). +	Currently this is used only by the `\--patch` mode of +	linkgit:git-add[1].  Note that this setting is silently +	ignored if portable keystroke input is not available. +  log.date::  	Set default date-time mode for the log command. Setting log.date  	value is similar to using 'git-log'\'s --date option. The value is one of the diff --git a/git-add--interactive.perl b/git-add--interactive.perl index 3bf0cda4ee..1813f9e8e3 100755 --- a/git-add--interactive.perl +++ b/git-add--interactive.perl @@ -33,6 +33,14 @@ my ($diff_new_color) =  my $normal_color = $repo->get_color("", "reset"); +my $use_readkey = 0; +if ($repo->config_bool("interactive.singlekey")) { +	eval { +		use Term::ReadKey; +		$use_readkey = 1; +	}; +} +  sub colored {  	my $color = shift;  	my $string = join("", @_); @@ -758,11 +766,32 @@ sub diff_applies {  	return close $fh;  } +sub _restore_terminal_and_die { +	ReadMode 'restore'; +	print "\n"; +	exit 1; +} + +sub prompt_single_character { +	if ($use_readkey) { +		local $SIG{TERM} = \&_restore_terminal_and_die; +		local $SIG{INT} = \&_restore_terminal_and_die; +		ReadMode 'cbreak'; +		my $key = ReadKey 0; +		ReadMode 'restore'; +		print "$key" if defined $key; +		print "\n"; +		return $key; +	} else { +		return <STDIN>; +	} +} +  sub prompt_yesno {  	my ($prompt) = @_;  	while (1) {  		print colored $prompt_color, $prompt; -		my $line = <STDIN>; +		my $line = prompt_single_character;  		return 0 if $line =~ /^n/i;  		return 1 if $line =~ /^y/i;  	} @@ -893,7 +922,7 @@ sub patch_update_file {  			print @{$mode->{DISPLAY}};  			print colored $prompt_color,  				"Stage mode change [y/n/a/d/?]? "; -			my $line = <STDIN>; +			my $line = prompt_single_character;  			if ($line =~ /^y/i) {  				$mode->{USE} = 1;  				last; @@ -966,7 +995,7 @@ sub patch_update_file {  			print;  		}  		print colored $prompt_color, "Stage this hunk [y,n,a,d,/$other,?]? "; -		my $line = <STDIN>; +		my $line = prompt_single_character;  		if ($line) {  			if ($line =~ /^y/i) {  				$hunk[$ix]{USE} = 1; @@ -1018,9 +1047,17 @@ sub patch_update_file {  				next;  			}  			elsif ($line =~ m|^/(.*)|) { +				my $regex = $1; +				if ($1 eq "") { +					print colored $prompt_color, "search for regex? "; +					$regex = <STDIN>; +					if (defined $regex) { +						chomp $regex; +					} +				}  				my $search_string;  				eval { -					$search_string = qr{$1}m; +					$search_string = qr{$regex}m;  				};  				if ($@) {  					my ($err,$exp) = ($@, $1);  | 
