diff -r 5c4e2636c1a9 -r 8c0c75aa3ff4 mercurial/bdiff.c --- a/mercurial/bdiff.c Tue Nov 08 18:37:33 2016 +0100 +++ b/mercurial/bdiff.c Tue Nov 08 18:37:33 2016 +0100 @@ -143,7 +143,7 @@ struct pos *pos, int a1, int a2, int b1, int b2, int *omi, int *omj) { - int mi = a1, mj = b1, mk = 0, i, j, k, half; + int mi = a1, mj = b1, mk = 0, i, j, k, half, bhalf; /* window our search on large regions to better bound worst-case performance. by choosing a window at the end, we @@ -152,6 +152,7 @@ a1 = a2 - 30000; half = (a1 + a2 - 1) / 2; + bhalf = (b1 + b2 - 1) / 2; for (i = a1; i < a2; i++) { /* skip all lines in b after the current block */ @@ -187,8 +188,8 @@ /* same match but closer to half */ mi = i; mj = j; - } else if (i == mi) { - /* same i but earlier j */ + } else if (i == mi && mj > bhalf) { + /* same i but best earlier j */ mj = j; } }