add -p: fix counting when splitting and coalescing

When a file has no trailing new line at the end diff records this by
appending "\ No newline at end of file" below the last line of the
file. This line should not be counted in the hunk header. Fix the
splitting and coalescing code to count files without a trailing new line
properly and change one of the tests to test splitting without a
trailing new line.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Phillip Wood 2018-03-05 10:56:29 +00:00 committed by Junio C Hamano
parent 2b8ea7f3c7
commit b3e0fcfe42
2 changed files with 34 additions and 8 deletions

View file

@ -793,6 +793,11 @@ sub split_hunk {
while (++$i < @$text) {
my $line = $text->[$i];
my $display = $display->[$i];
if ($line =~ /^\\/) {
push @{$this->{TEXT}}, $line;
push @{$this->{DISPLAY}}, $display;
next;
}
if ($line =~ /^ /) {
if ($this->{ADDDEL} &&
!defined $next_hunk_start) {
@ -891,6 +896,9 @@ sub merge_hunk {
$n_cnt++;
push @line, $line;
next;
} elsif ($line =~ /^\\/) {
push @line, $line;
next;
}
last if ($o1_ofs <= $ofs);
@ -909,6 +917,9 @@ sub merge_hunk {
$n_cnt++;
push @line, $line;
next;
} elsif ($line =~ /^\\/) {
push @line, $line;
next;
}
$ofs++;
$o_cnt++;

View file

@ -237,14 +237,15 @@ test_expect_success 'setup patch' '
baseline
content
+lastline
\ No newline at end of file
EOF
'
# Expected output, similar to the patch but w/ diff at the top
# Expected output, diff is similar to the patch but w/ diff at the top
test_expect_success 'setup expected' '
cat >expected <<-\EOF
diff --git a/file b/file
index b6f2c08..61b9053 100755
echo diff --git a/file b/file >expected &&
cat patch |sed "/^index/s/ 100644/ 100755/" >>expected &&
cat >expected-output <<-\EOF
--- a/file
+++ b/file
@@ -1,2 +1,4 @@
@ -252,16 +253,30 @@ test_expect_success 'setup expected' '
baseline
content
+lastline
\ No newline at end of file
@@ -1,2 +1,3 @@
+firstline
baseline
content
@@ -1,2 +2,3 @@
baseline
content
+lastline
\ No newline at end of file
EOF
'
# Test splitting the first patch, then adding both
test_expect_success 'add first line works' '
test_expect_success C_LOCALE_OUTPUT 'add first line works' '
git commit -am "clear local changes" &&
git apply patch &&
(echo s; echo y; echo y) | git add -p file &&
git diff --cached > diff &&
diff_cmp expected diff
printf "%s\n" s y y | git add -p file 2>error |
sed -n -e "s/^Stage this hunk[^@]*\(@@ .*\)/\1/" \
-e "/^[-+@ \\\\]"/p >output &&
test_must_be_empty error &&
git diff --cached >diff &&
diff_cmp expected diff &&
test_cmp expected-output output
'
test_expect_success 'setup expected' '