add--interactive: allow user to choose mode update
authorJeff King <peff@peff.net>
Thu, 27 Mar 2008 07:32:25 +0000 (03:32 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 27 Mar 2008 20:54:57 +0000 (13:54 -0700)
When using the 'p'atch command, instead of just throwing out any mode
change, present it to the user in the same way that we show hunks.

This way, the mode change can be staged independently from the changes
to the contents.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-add--interactive.perl
t/t3701-add-interactive.sh

index 5cdda29c548fd8aa776622b6a698516d8ca386e4..903953e68e98535e754b5a5dd6ba22eb6074ef20 100755 (executable)
@@ -814,6 +814,36 @@ sub patch_update_file {
        for (@{$head->{DISPLAY}}) {
                print;
        }
+
+       if (@{$mode->{TEXT}}) {
+               while (1) {
+                       print @{$mode->{DISPLAY}};
+                       print colored $prompt_color,
+                               "Stage mode change [y/n/a/d/?]? ";
+                       my $line = <STDIN>;
+                       if ($line =~ /^y/i) {
+                               $mode->{USE} = 1;
+                               last;
+                       }
+                       elsif ($line =~ /^n/i) {
+                               $mode->{USE} = 0;
+                               last;
+                       }
+                       elsif ($line =~ /^a/i) {
+                               $_->{USE} = 1 foreach ($mode, @hunk);
+                               last;
+                       }
+                       elsif ($line =~ /^d/i) {
+                               $_->{USE} = 0 foreach ($mode, @hunk);
+                               last;
+                       }
+                       else {
+                               help_patch_cmd('');
+                               next;
+                       }
+               }
+       }
+
        $num = scalar @hunk;
        $ix = 0;
 
@@ -936,6 +966,9 @@ sub patch_update_file {
 
        my $n_lofs = 0;
        my @result = ();
+       if ($mode->{USE}) {
+               push @result, @{$mode->{TEXT}};
+       }
        for (@hunk) {
                my $text = $_->{TEXT};
                my ($o_ofs, $o_cnt, $n_ofs, $n_cnt) =
index d920d06d5a8e1f5c09f2f0a2d5a77da1b59cdccf..f15be93e7709acbb517bb85020d4d6b94a50f725 100755 (executable)
@@ -70,9 +70,19 @@ test_expect_success 'patch does not affect mode' '
        git reset --hard &&
        echo content >>file &&
        chmod +x file &&
-       printf "y\\n" | git add -p &&
+       printf "n\\ny\\n" | git add -p &&
        git show :file | grep content &&
        git diff file | grep "new mode"
 '
 
+test_expect_success 'stage mode but not hunk' '
+       git reset --hard &&
+       echo content >>file &&
+       chmod +x file &&
+       printf "y\\nn\\n" | git add -p &&
+       git diff --cached file | grep "new mode" &&
+       git diff          file | grep "+content"
+'
+
+
 test_done