xdiff: don't trim common tail with -W
The function trim_common_tail() exits early if context lines are requested. If -U0 and -W are specified together then it can still trim context lines that might belong to a changed function. As a result that function is shown incompletely. Fix that by calling trim_common_tail() only if no function context or fixed context is requested. The parameter ctx is no longer needed now; remove it. While at it fix an outdated comment as well. Signed-off-by: Rene Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
René Scharfe committed
May 28, 2016 at 17:04 UTC
e0876bca4de44638a1cb51b03bdf0a40df631a80
2 files changed
+5
-7
t/t4051-diff-function-context.sh
+1
-1
@@ -145,7 +145,7 @@ test_expect_success ' context includes begin' '
145
grep "^ .*Begin of first part" long_common_tail.diff
146
'
147
148
-test_expect_failure ' context includes end' '
148
+test_expect_success ' context includes end' '
149
grep "^ .*End of second part" long_common_tail.diff
150
'
151
xdiff-interface.c
+4
-6
@@ -100,9 +100,9 @@ static int xdiff_outf(void *priv_, mmbuffer_t *mb, int nbuf)
100
101
/*
102
* Trim down common substring at the end of the buffers,
103
- * but leave at least ctx lines at the end.
103
+ * but end on a complete line.
104
*/
105
-static void trim_common_tail(mmfile_t *a, mmfile_t *b, long ctx)
105
+static void trim_common_tail(mmfile_t *a, mmfile_t *b)
106
{
107
const int blk = 1024;
108
long trimmed = 0, recovered = 0;
@@ -110,9 +110,6 @@ static void trim_common_tail(mmfile_t *a, mmfile_t *b, long ctx)
110
char *bp = b->ptr + b->size;
111
long smaller = (a->size < b->size) ? a->size : b->size;
112
113
- if (ctx)
114
- return;
115
-
113
while (blk + trimmed <= smaller && !memcmp(ap - blk, bp - blk, blk)) {
114
trimmed += blk;
115
ap -= blk;
@@ -134,7 +131,8 @@ int xdi_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, xdemitconf_t co
131
if (mf1->size > MAX_XDIFF_SIZE || mf2->size > MAX_XDIFF_SIZE)
132
return -1;
133
137
- trim_common_tail(&a, &b, xecfg->ctxlen);
134
+ if (!xecfg->ctxlen && !(xecfg->flags & XDL_EMIT_FUNCCONTEXT))
135
+ trim_common_tail(&a, &b);
136
137
return xdl_diff(&a, &b, xpp, xecfg, xecb);
138
}