Re: [PATCH v2] add-interactive: fix bogus diff header line ordering

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Jeff King <peff@xxxxxxxx> writes:

>> ...  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.

>
>  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
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]