diff --git a/mercurial/bdiff.c b/mercurial/bdiff.c --- a/mercurial/bdiff.c +++ b/mercurial/bdiff.c @@ -151,7 +151,7 @@ static int longest_match(struct bdiff_li if (a2 - a1 > 30000) a1 = a2 - 30000; - half = (a1 + a2) / 2; + half = (a1 + a2 - 1) / 2; for (i = a1; i < a2; i++) { /* skip all lines in b after the current block */ @@ -177,7 +177,7 @@ static int longest_match(struct bdiff_li /* best match so far? we prefer matches closer to the middle to balance recursion */ - if (k > mk || (k == mk && (i <= mi || i < half))) { + if (k > mk || (k == mk && (i <= mi || i <= half))) { mi = i; mj = j; mk = k; diff --git a/tests/test-bdiff.py b/tests/test-bdiff.py --- a/tests/test-bdiff.py +++ b/tests/test-bdiff.py @@ -88,7 +88,7 @@ print("Diff 1 to 3 lines - preference fo showdiff('a\n', 'a\n' * 3) print("Diff 1 to 5 lines - preference for adding / removing at the end of sequences:") showdiff('a\n', 'a\n' * 5) -print("Diff 3 to 1 lines - preference for adding / removing at the end of sequences:") +print("Diff 3 to 1 lines - preference for balanced recursion:") showdiff('a\n' * 3, 'a\n') -print("Diff 5 to 1 lines - this diff seems weird:") +print("Diff 5 to 1 lines - preference for balanced recursion:") showdiff('a\n' * 5, 'a\n') diff --git a/tests/test-bdiff.py.out b/tests/test-bdiff.py.out --- a/tests/test-bdiff.py.out +++ b/tests/test-bdiff.py.out @@ -67,16 +67,17 @@ showdiff( 'a\na\na\na\na\n'): 'a\n' 2 2 '' -> 'a\na\na\na\n' -Diff 3 to 1 lines - preference for adding / removing at the end of sequences: +Diff 3 to 1 lines - preference for balanced recursion: showdiff( 'a\na\na\n', 'a\n'): + 0 2 'a\n' -> '' 'a\n' - 2 6 'a\na\n' -> '' -Diff 5 to 1 lines - this diff seems weird: + 4 6 'a\n' -> '' +Diff 5 to 1 lines - preference for balanced recursion: showdiff( 'a\na\na\na\na\n', 'a\n'): - 0 2 'a\n' -> '' + 0 4 'a\na\n' -> '' 'a\n' - 4 10 'a\na\na\n' -> '' + 6 10 'a\na\n' -> ''