dagop: factor out generator of ancestor nodes

# ancestors(tip) using hg repo
  1) 0.068976
  2) 0.068527
This commit is contained in:
Yuya Nishihara 2017-06-24 23:30:51 +09:00
parent 568f49d319
commit 06592918ad

View File

@ -23,11 +23,14 @@ generatorset = smartset.generatorset
# 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 @@ def _genrevancestors(repo, revs, followfirst, startdepth, stopdepth):
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 @@ def _genrevancestors(repo, revs, followfirst, startdepth, stopdepth):
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