revset: optimize roots and children
authorMatt Mackall <mpm@selenic.com>
Mon, 16 Jan 2012 01:21:30 -0600
changeset 15899 476a981fdf34
parent 15898 6902e13ddd03
child 15901 73c4b3d0c711
revset: optimize roots and children
mercurial/revset.py
--- a/mercurial/revset.py	Mon Jan 16 01:21:22 2012 -0600
+++ b/mercurial/revset.py	Mon Jan 16 01:21:30 2012 -0600
@@ -321,17 +321,22 @@
                     break
     return s
 
+def _children(repo, narrow, s):
+    cs = set()
+    pr = repo.changelog.parentrevs
+    s = set(s)
+    for r in narrow:
+        for p in pr(r):
+            if p in s:
+                cs.add(r)
+    return cs
+
 def children(repo, subset, x):
     """``children(set)``
     Child changesets of changesets in set.
     """
-    cs = set()
-    cl = repo.changelog
-    s = set(getset(repo, range(len(repo)), x))
-    for r in xrange(0, len(repo)):
-        for p in cl.parentrevs(r):
-            if p in s:
-                cs.add(r)
+    s = getset(repo, range(len(repo)), x)
+    cs = _children(repo, subset, s)
     return [r for r in subset if r in cs]
 
 def closed(repo, subset, x):
@@ -772,7 +777,7 @@
     Changesets with no parent changeset in set.
     """
     s = getset(repo, subset, x)
-    cs = set(children(repo, subset, x))
+    cs = _children(repo, s, s)
     return [r for r in s if r not in cs]
 
 def secret(repo, subset, x):