Skip to content

Commit

Permalink
Re-re-re-fix common tail optimization
Browse files Browse the repository at this point in the history
We need to be extra careful recovering the removed common section, so
that we do not break context nor the changed incomplete line (i.e. the
last line that does not end with LF).

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
gitster committed Dec 16, 2007
1 parent 127f72e commit 079fe1d
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 1 deletion.
69 changes: 69 additions & 0 deletions t/t4024-diff-optimize-common.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#!/bin/sh

test_description='common tail optimization'

. ./test-lib.sh

z=zzzzzzzz ;# 8
z="$z$z$z$z$z$z$z$z" ;# 64
z="$z$z$z$z$z$z$z$z" ;# 512
z="$z$z$z$z" ;# 2048
z2047=$(expr "$z" : '.\(.*\)') ; #2047

test_expect_success setup '
echo "a$z2047" >file-a &&
echo "b" >file-b &&
echo "$z2047" >>file-b &&
echo "c$z2047" | tr -d "\012" >file-c &&
echo "d" >file-d &&
echo "$z2047" | tr -d "\012" >>file-d &&
git add file-a file-b file-c file-d &&
echo "A$z2047" >file-a &&
echo "B" >file-b &&
echo "$z2047" >>file-b &&
echo "C$z2047" | tr -d "\012" >file-c &&
echo "D" >file-d &&
echo "$z2047" | tr -d "\012" >>file-d
'

cat >expect <<\EOF
diff --git a/file-a b/file-a
--- a/file-a
+++ b/file-a
@@ -1 +1 @@
-aZ
+AZ
diff --git a/file-b b/file-b
--- a/file-b
+++ b/file-b
@@ -1 +1 @@
-b
+B
diff --git a/file-c b/file-c
--- a/file-c
+++ b/file-c
@@ -1 +1 @@
-cZ
\ No newline at end of file
+CZ
\ No newline at end of file
diff --git a/file-d b/file-d
--- a/file-d
+++ b/file-d
@@ -1 +1 @@
-d
+D
EOF

test_expect_success 'diff -U0' '
git diff -U0 | sed -e "/^index/d" -e "s/$z2047/Z/g" >actual &&
diff -u expect actual
'

test_done
2 changes: 1 addition & 1 deletion xdiff-interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ static void trim_common_tail(mmfile_t *a, mmfile_t *b, long ctx)
bp -= blk;
}

while (recovered < trimmed && ctx)
while (recovered < trimmed && 0 <= ctx)
if (ap[recovered++] == '\n')
ctx--;
a->size -= (trimmed - recovered);
Expand Down

0 comments on commit 079fe1d

Please sign in to comment.