mirror of
https://github.com/facebook/sapling.git
synced 2024-10-08 15:57:43 +03:00
dagop: factor out generator of ancestor nodes
# ancestors(tip) using hg repo 1) 0.068976 2) 0.068527
This commit is contained in:
parent
568f49d319
commit
06592918ad
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user