Browse Source

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 <gitster@pobox.com>
maint
Junio C Hamano 17 years ago
parent
commit
079fe1dae8
  1. 69
      t/t4024-diff-optimize-common.sh
  2. 2
      xdiff-interface.c

69
t/t4024-diff-optimize-common.sh

@ -0,0 +1,69 @@ @@ -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
xdiff-interface.c

@ -121,7 +121,7 @@ static void trim_common_tail(mmfile_t *a, mmfile_t *b, long ctx) @@ -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);

Loading…
Cancel
Save