Mercurial > hg-stable
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