mercurial/bdiff.c
branchstable
changeset 29014 f1ca249696ed
parent 29013 9a8363d23419
child 29015 87d4a6c5567e
--- a/mercurial/bdiff.c	Thu Apr 21 21:05:26 2016 -0500
+++ b/mercurial/bdiff.c	Thu Apr 21 22:04:11 2016 -0500
@@ -148,7 +148,7 @@
 static int longest_match(struct line *a, struct line *b, struct pos *pos,
 			 int a1, int a2, int b1, int b2, int *omi, int *omj)
 {
-	int mi = a1, mj = b1, mk = 0, mb = 0, i, j, k;
+	int mi = a1, mj = b1, mk = 0, mb = 0, i, j, k, half = (a1 + a2) / 2;
 
 	for (i = a1; i < a2; i++) {
 		/* skip all lines in b after the current block */
@@ -165,8 +165,9 @@
 			pos[j].pos = i;
 			pos[j].len = k;
 
-			/* best match so far? */
-			if (k > mk || (k == mk && i <= mi)) {
+			/* best match so far? we prefer matches closer
+			   to the middle to balance recursion */
+			if (k > mk || (k == mk && (i <= mi || i < half))) {
 				mi = i;
 				mj = j;
 				mk = k;