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 }