diff options
| -rwxr-xr-x | git-add--interactive.perl | 24 | ||||
| -rwxr-xr-x | 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 cd43c34912..21f1330a5b 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 4d1c2e9e09..2144184d79 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  | 
