Re: [PATCH v2] add-interactive: fix bogus diff header line ordering
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:48:20
Jeff King [off-list ref] writes:
quoted
... Hmm. I am not sure we would even need to treat hunks individually...the misplaced header lines should always be part of the _first_ hunk.Like this.
Looks much better ;-). Thanks.
quoted hunk
git-add--interactive.perl | 24 +++++++++++++++++++++++- t/t2016-checkout-patch.sh | 8 ++++++++ 2 files changed, 31 insertions(+), 1 deletions(-)diff --git a/git-add--interactive.perl b/git-add--interactive.perl index cd43c34..21f1330 100755 --- a/git-add--interactive.perl +++ b/git-add--interactive.perl@@ -957,6 +957,28 @@ sub coalesce_overlapping_hunks { return @out; } +sub reassemble_patch { + my $head = shift; + my @patch; + + # Include everything in the header except the beginning of the diff. + push @patch, (grep { !/^[-+]{3}/ } @$head); + + # Then include any headers from the hunk lines, which must + # come before any actual hunk. + while (@_ && $_[0] !~ /^@/) { + push @patch, shift; + } + + # Then begin the diff. + push @patch, grep { /^[-+]{3}/ } @$head; + + # And then the actual hunks. + push @patch, @_; + + return @patch; +} + sub color_diff { return map { colored((/^@/ ? $fraginfo_color :@@ -1453,7 +1475,7 @@ sub patch_update_file { if (@result) { my $fh; - my @patch = (@{$head->{TEXT}}, @result); + my @patch = reassemble_patch($head->{TEXT}, @result); my $apply_routine = $patch_mode_flavour{APPLY}; &$apply_routine(@patch); refresh();diff --git a/t/t2016-checkout-patch.sh b/t/t2016-checkout-patch.sh index 4d1c2e9..2144184 100755 --- a/t/t2016-checkout-patch.sh +++ b/t/t2016-checkout-patch.sh@@ -66,6 +66,14 @@ test_expect_success 'git checkout -p HEAD^' ' verify_state dir/foo parent parent ' +test_expect_success 'git checkout -p handles deletion' ' + set_state dir/foo work index && + rm dir/foo && + (echo n; echo y) | git checkout -p && + verify_saved_state bar && + verify_state dir/foo index index +' + # The idea in the rest is that bar sorts first, so we always say 'y' # first and if the path limiter fails it'll apply to bar instead of # dir/foo. There's always an extra 'n' to reject edits to dir/foo in-- 1.7.0.207.g88f1