changeset 33090:fb663bd0243f

dagop: factor out generator of ancestor nodes # ancestors(tip) using hg repo 1) 0.068976 2) 0.068527
author Yuya Nishihara <yuya@tcha.org>
date Sat, 24 Jun 2017 23:30:51 +0900
parents 58ebb38456e0
children 550c390cd9b2
files mercurial/dagop.py
diffstat 1 files changed, 21 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/dagop.py	Sat Jun 24 23:22:45 2017 +0900
+++ b/mercurial/dagop.py	Sat Jun 24 23:30:51 2017 +0900
@@ -23,11 +23,14 @@
 # possible maximum depth between null and wdir()
 _maxlogdepth = 0x80000000
 
-def _genrevancestors(repo, revs, followfirst, startdepth, stopdepth):
-    if followfirst:
-        cut = 1
-    else:
-        cut = None
+def _walkrevtree(pfunc, revs, startdepth, stopdepth):
+    """Walk DAG using 'pfunc' from the given 'revs' nodes
+
+    'pfunc(rev)' should return the parent revisions of the given 'rev'.
+
+    Scan ends at the stopdepth (exlusive) if specified. Revisions found
+    earlier than the startdepth are omitted.
+    """
     if startdepth is None:
         startdepth = 0
     if stopdepth is None:
@@ -37,13 +40,6 @@
     if stopdepth < 0:
         raise error.ProgrammingError('negative stopdepth')
 
-    cl = repo.changelog
-    def pfunc(rev):
-        try:
-            return cl.parentrevs(rev)[:cut]
-        except error.WdirUnsupported:
-            return (pctx.rev() for pctx in repo[rev].parents()[:cut])
-
     # load input revs lazily to heap so earlier revisions can be yielded
     # without fully computing the input revs
     revs.sort(reverse=True)
@@ -74,6 +70,19 @@
                 if prev != node.nullrev:
                     heapq.heappush(pendingheap, (-prev, pdepth))
 
+def _genrevancestors(repo, revs, followfirst, startdepth, stopdepth):
+    if followfirst:
+        cut = 1
+    else:
+        cut = None
+    cl = repo.changelog
+    def pfunc(rev):
+        try:
+            return cl.parentrevs(rev)[:cut]
+        except error.WdirUnsupported:
+            return (pctx.rev() for pctx in repo[rev].parents()[:cut])
+    return _walkrevtree(pfunc, revs, startdepth, stopdepth)
+
 def revancestors(repo, revs, followfirst, startdepth=None, stopdepth=None):
     """Like revlog.ancestors(), but supports additional options, includes
     the given revs themselves, and returns a smartset