Skip to content

Commit

Permalink
add--interactive: ignore mode change in 'p'atch command
Browse files Browse the repository at this point in the history
When a path is examined in the patch subcommand, any mode changes in
the file are given to use in the diff header by git-diff. If no hunks
are staged, then we throw out that header and do not touch the
path.  But if _any_ hunks are staged, we use the header, and the mode
is changed together with the contents.

Since the 'p'atch command should just be dealing with hunks that are
shown to the user, it makes sense to just ignore mode changes
entirely. We do squirrel away the mode, though, since the next patch
will allow users to select the mode update separately.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Mar 27, 2008
1 parent 1768905 commit b717a62
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 0 deletions.
16 changes: 16 additions & 0 deletions git-add--interactive.perl
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,21 @@ sub parse_diff {
return @hunk;
}

sub parse_diff_header {
my $src = shift;

my $head = { TEXT => [], DISPLAY => [] };
my $mode = { TEXT => [], DISPLAY => [] };

for (my $i = 0; $i < @{$src->{TEXT}}; $i++) {
my $dest = $src->{TEXT}->[$i] =~ /^(old|new) mode (\d+)$/ ?
$mode : $head;
push @{$dest->{TEXT}}, $src->{TEXT}->[$i];
push @{$dest->{DISPLAY}}, $src->{DISPLAY}->[$i];
}
return ($head, $mode);
}

sub hunk_splittable {
my ($text) = @_;

Expand Down Expand Up @@ -795,6 +810,7 @@ sub patch_update_file {
my ($ix, $num);
my $path = shift;
my ($head, @hunk) = parse_diff($path);
($head, my $mode) = parse_diff_header($head);
for (@{$head->{DISPLAY}}) {
print;
}
Expand Down
9 changes: 9 additions & 0 deletions t/t3701-add-interactive.sh
Original file line number Diff line number Diff line change
Expand Up @@ -66,4 +66,13 @@ test_expect_success 'revert works (commit)' '
grep "unchanged *+3/-0 file" output
'

test_expect_success 'patch does not affect mode' '
git reset --hard &&
echo content >>file &&
chmod +x file &&
printf "y\\n" | git add -p &&
git show :file | grep content &&
git diff file | grep "new mode"
'

test_done

0 comments on commit b717a62

Please sign in to comment.