Patchwork [3,of,3,stable,V2] ancestor.deepest: ignore ninteresting while building result (issue3984)

login
register
mail settings
Submitter Siddharth Agarwal
Date July 25, 2013, 10:50 p.m.
Message ID <d1b3eb916397d91a52a6.1374792604@dev1091.prn1.facebook.com>
Download mbox | patch
Permalink /patch/1967/
State Superseded
Headers show

Comments

Siddharth Agarwal - July 25, 2013, 10:50 p.m.
# HG changeset patch
# User Siddharth Agarwal <sid0@fb.com>
# Date 1374788595 25200
#      Thu Jul 25 14:43:15 2013 -0700
# Branch stable
# Node ID d1b3eb916397d91a52a6ac41d08db23899e54fab
# Parent  e2b3ff5b507ac825fa646e49c61696e8d3ca3bcc
ancestor.deepest: ignore ninteresting while building result (issue3984)

ninteresting indicates the number of non-zero elements in the interesting
array, not the number of elements in the final list. Since elements in
interesting can stand for more than one gca, limiting the number of results to
ninteresting is an error.

Tests for issue3984 are included.

Patch

diff --git a/mercurial/parsers.c b/mercurial/parsers.c
--- a/mercurial/parsers.c
+++ b/mercurial/parsers.c
@@ -1388,8 +1388,7 @@ 
 	if (dict == NULL)
 		goto bail;
 
-	j = ninteresting;
-	for (i = 0; i < revcount && j > 0; i++) {
+	for (i = 0; i < revcount; i++) {
 		PyObject *key;
 
 		if ((final & (1 << i)) == 0)
@@ -1403,7 +1402,6 @@ 
 			Py_DECREF(Py_None);
 			goto bail;
 		}
-		j -= 1;
 	}
 
 	keys = PyDict_Keys(dict);
diff --git a/tests/test-ancestor.py b/tests/test-ancestor.py
--- a/tests/test-ancestor.py
+++ b/tests/test-ancestor.py
@@ -1,4 +1,4 @@ 
-from mercurial import ancestor
+from mercurial import ancestor, commands, hg, ui
 
 # graph is a dict of child->parent adjacency lists for this graph:
 # o  13
@@ -101,6 +101,36 @@ 
     s = genlazyancestors([11, 13], stoprev=6, inclusive=True)
     printlazyancestors(s, [11, 13, 7, 9, 8, 3, 6, 4, 1, -1, 0])
 
+
+# The C gca algorithm requires a real repo. These are textual descriptions of
+# dags that have been known to be problematic.
+dagtests = [
+    '+2*2*2/*3/2',
+    '+3*3/*2*2/*4*4/*4/2*4/2*2',
+]
+def test_gca():
+    u = ui.ui()
+    for i, dag in enumerate(dagtests):
+        repo = hg.repository(u, 'gca%d' % i, create=1)
+        cl = repo.changelog
+        if not hasattr(cl.index, 'ancestors'):
+            # C version not available
+            return
+
+        commands.debugbuilddag(u, repo, dag)
+        # Compare the results of the Python and C versions. This does not
+        # include choosing a winner when more than one gca exists -- we make
+        # sure both return exactly the same set of gcas.
+        for a in cl:
+            for b in cl:
+                cgcas = sorted(cl.index.ancestors(a, b))
+                pygcas = sorted(ancestor.ancestors(cl.parentrevs, a, b))
+                if cgcas != pygcas:
+                    print "test_gca: for dag %s, gcas for %d, %d:" % (dag, a, b)
+                    print "  C returned:      %s" % cgcas
+                    print "  Python returned: %s" % pygcas
+
 if __name__ == '__main__':
     test_missingancestors()
     test_lazyancestors()
+    test_gca()