From: Junio C Hamano Date: Sun, 16 Dec 2007 21:49:17 +0000 (-0800) Subject: Re-re-re-fix common tail optimization X-Git-Tag: v1.5.4-rc1~34 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=079fe1dae8504c988c50ce41eba78743d3f588e0;p=git.git Re-re-re-fix common tail optimization 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 --- diff --git a/t/t4024-diff-optimize-common.sh b/t/t4024-diff-optimize-common.sh new file mode 100755 index 000000000..20fe87b7d --- /dev/null +++ b/t/t4024-diff-optimize-common.sh @@ -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 diff --git a/xdiff-interface.c b/xdiff-interface.c index 98b02eda3..9ee877c6f 100644 --- a/xdiff-interface.c +++ b/xdiff-interface.c @@ -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);