dagop: factor out generator of ancestor nodes
# ancestors(tip) using hg repo
1) 0.068976
2) 0.068527
--- 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