Add / command in add --patch
authorWilliam Pursell <bill.pursell@gmail.com>
Thu, 27 Nov 2008 04:07:57 +0000 (04:07 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 2 Feb 2009 03:43:38 +0000 (19:43 -0800)
This command allows the user to skip hunks that don't match the specified
regex.

Signed-off-by: William Pursell <bill.pursell@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-add--interactive.perl

index ca50363341d8c71e158c2e82e440042227969778..64ad28998e55f189cfa079db232bbf7ef12d93ba 100755 (executable)
@@ -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
@@ -964,7 +965,7 @@ sub patch_update_file {
                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) {
@@ -1013,6 +1014,31 @@ sub patch_update_file {
                                }
                                next;
                        }
+                       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 ($other =~ /K/ && $line =~ /^K/) {
                                $ix--;
                                next;