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>
This commit is contained in:
René Scharfe 2016-05-28 17:04:31 +02:00 committed by Junio C Hamano
parent 9e6a4cfc38
commit e0876bca4d
2 changed files with 5 additions and 7 deletions

View File

@ -145,7 +145,7 @@ test_expect_success ' context includes begin' '
grep "^ .*Begin of first part" long_common_tail.diff grep "^ .*Begin of first part" long_common_tail.diff
' '
test_expect_failure ' context includes end' ' test_expect_success ' context includes end' '
grep "^ .*End of second part" long_common_tail.diff grep "^ .*End of second part" long_common_tail.diff
' '

View File

@ -100,9 +100,9 @@ static int xdiff_outf(void *priv_, mmbuffer_t *mb, int nbuf)
/* /*
* Trim down common substring at the end of the buffers, * Trim down common substring at the end of the buffers,
* but leave at least ctx lines at the end. * but end on a complete line.
*/ */
static void trim_common_tail(mmfile_t *a, mmfile_t *b, long ctx) static void trim_common_tail(mmfile_t *a, mmfile_t *b)
{ {
const int blk = 1024; const int blk = 1024;
long trimmed = 0, recovered = 0; long trimmed = 0, recovered = 0;
@ -110,9 +110,6 @@ static void trim_common_tail(mmfile_t *a, mmfile_t *b, long ctx)
char *bp = b->ptr + b->size; char *bp = b->ptr + b->size;
long smaller = (a->size < b->size) ? a->size : b->size; long smaller = (a->size < b->size) ? a->size : b->size;
if (ctx)
return;
while (blk + trimmed <= smaller && !memcmp(ap - blk, bp - blk, blk)) { while (blk + trimmed <= smaller && !memcmp(ap - blk, bp - blk, blk)) {
trimmed += blk; trimmed += blk;
ap -= blk; ap -= blk;
@ -134,7 +131,8 @@ int xdi_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, xdemitconf_t co
if (mf1->size > MAX_XDIFF_SIZE || mf2->size > MAX_XDIFF_SIZE) if (mf1->size > MAX_XDIFF_SIZE || mf2->size > MAX_XDIFF_SIZE)
return -1; return -1;
trim_common_tail(&a, &b, xecfg->ctxlen); if (!xecfg->ctxlen && !(xecfg->flags & XDL_EMIT_FUNCCONTEXT))
trim_common_tail(&a, &b);
return xdl_diff(&a, &b, xpp, xecfg, xecb); return xdl_diff(&a, &b, xpp, xecfg, xecb);
} }