Merge branch 'wp/add-patch-find'

* wp/add-patch-find:
  add -p: trap Ctrl-D in 'goto' mode
  add -p: change prompt separator for 'g'
  In add --patch, Handle K,k,J,j slightly more gracefully.
  Add / command in add --patch
  git-add -i/-p: Change prompt separater from slash to comma
This commit is contained in:
Junio C Hamano 2009-02-04 13:07:06 -08:00
commit d3f552b674

View File

@ -801,6 +801,7 @@ n - do not stage this hunk
a - stage this and all the remaining hunks in the file
d - do not stage this hunk nor any of the remaining hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
@ -929,25 +930,25 @@ sub patch_update_file {
for ($i = 0; $i < $ix; $i++) {
if (!defined $hunk[$i]{USE}) {
$prev = 1;
$other .= '/k';
$other .= ',k';
last;
}
}
if ($ix) {
$other .= '/K';
$other .= ',K';
}
for ($i = $ix + 1; $i < $num; $i++) {
if (!defined $hunk[$i]{USE}) {
$next = 1;
$other .= '/j';
$other .= ',j';
last;
}
}
if ($ix < $num - 1) {
$other .= '/J';
$other .= ',J';
}
if ($num > 1) {
$other .= '/g';
$other .= ',g';
}
for ($i = 0; $i < $num; $i++) {
if (!defined $hunk[$i]{USE}) {
@ -958,13 +959,13 @@ sub patch_update_file {
last if (!$undecided);
if (hunk_splittable($hunk[$ix]{TEXT})) {
$other .= '/s';
$other .= ',s';
}
$other .= '/e';
$other .= ',e';
for (@{$hunk[$ix]{DISPLAY}}) {
print;
}
print colored $prompt_color, "Stage this hunk [y/n/a/d$other/?]? ";
print colored $prompt_color, "Stage this hunk [y,n,a,d,/$other,?]? ";
my $line = <STDIN>;
if ($line) {
if ($line =~ /^y/i) {
@ -993,6 +994,9 @@ sub patch_update_file {
}
print "go to which hunk$extra? ";
$response = <STDIN>;
if (!defined $response) {
$response = '';
}
chomp $response;
}
if ($response !~ /^\s*\d+\s*$/) {
@ -1013,30 +1017,68 @@ sub patch_update_file {
}
next;
}
elsif ($other =~ /K/ && $line =~ /^K/) {
$ix--;
next;
}
elsif ($other =~ /J/ && $line =~ /^J/) {
$ix++;
next;
}
elsif ($other =~ /k/ && $line =~ /^k/) {
elsif ($line =~ m|^/(.*)|) {
my $search_string;
eval {
$search_string = qr{$1}m;
};
if ($@) {
my ($err,$exp) = ($@, $1);
$err =~ s/ at .*git-add--interactive line \d+, <STDIN> line \d+.*$//;
print STDERR "Malformed search regexp $exp: $err\n";
next;
}
my $iy = $ix;
while (1) {
my $text = join ("", @{$hunk[$iy]{TEXT}});
last if ($text =~ $search_string);
$iy++;
$iy = 0 if ($iy >= $num);
if ($ix == $iy) {
print STDERR "No hunk matches the given pattern\n";
last;
}
}
$ix = $iy;
next;
}
elsif ($line =~ /^K/) {
if ($other =~ /K/) {
$ix--;
last if (!$ix ||
!defined $hunk[$ix]{USE});
}
else {
print STDERR "No previous hunk\n";
}
next;
}
elsif ($other =~ /j/ && $line =~ /^j/) {
while (1) {
elsif ($line =~ /^J/) {
if ($other =~ /J/) {
$ix++;
last if ($ix >= $num ||
!defined $hunk[$ix]{USE});
}
else {
print STDERR "No next hunk\n";
}
next;
}
elsif ($line =~ /^k/) {
if ($other =~ /k/) {
while (1) {
$ix--;
last if (!$ix ||
!defined $hunk[$ix]{USE});
}
}
else {
print STDERR "No previous hunk\n";
}
next;
}
elsif ($line =~ /^j/) {
if ($other !~ /j/) {
print STDERR "No next hunk\n";
next;
}
}
elsif ($other =~ /s/ && $line =~ /^s/) {
my @split = split_hunk($hunk[$ix]{TEXT}, $hunk[$ix]{DISPLAY});
if (1 < @split) {