Mercurial > public > mercurial-scm > hg
diff mercurial/dagop.py @ 33003:f63d111258da
revset: add startdepth limit to ancestors() as internal option
This is necessary to implement the set{gen} (set subscript) operator. For
example, set{-n} will be translated to ancestors(set, depth=n, startdepth=n).
https://www.mercurial-scm.org/wiki/RevsetOperatorPlan#ideas_from_mpm
The UI is undecided and I doubt if the startdepth option would be actually
useful, so the option is hidden for now. 'depth' could be extended to take
min:max range, in which case, integer depth should select a single generation.
ancestors(set, depth=:y) # scan up to y-th generation
ancestors(set, depth=x:) # skip until (x-1)-th generation
ancestors(set, depth=x) # select only x-th generation
Any ideas are welcomed.
# reverse(ancestors(tip)) using hg repo
3) 0.075951
4) 0.076175
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sun, 18 Jun 2017 00:40:58 +0900 |
parents | 272a44cac57e |
children | a10f5f6771f6 |
line wrap: on
line diff
--- a/mercurial/dagop.py Sun Jun 18 00:22:41 2017 +0900 +++ b/mercurial/dagop.py Sun Jun 18 00:40:58 2017 +0900 @@ -23,11 +23,13 @@ # possible maximum depth between null and wdir() _maxlogdepth = 0x80000000 -def _genrevancestors(repo, revs, followfirst, stopdepth): +def _genrevancestors(repo, revs, followfirst, startdepth, stopdepth): if followfirst: cut = 1 else: cut = None + if startdepth is None: + startdepth = 0 if stopdepth is None: stopdepth = _maxlogdepth if stopdepth <= 0: @@ -53,8 +55,10 @@ inputrev = next(irevs, None) if inputrev is not None: heapq.heappush(pendingheap, (-inputrev, 0)) + # rescan parents until curdepth >= startdepth because queued entries + # of the same revision are iterated from the lowest depth foundnew = (currev != lastrev) - if foundnew: + if foundnew and curdepth >= startdepth: lastrev = currev yield currev pdepth = curdepth + 1 @@ -68,13 +72,14 @@ if pctx.rev() != node.nullrev: heapq.heappush(pendingheap, (-pctx.rev(), pdepth)) -def revancestors(repo, revs, followfirst, stopdepth=None): +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 - Scan ends at the stopdepth (exlusive) if specified. + Scan ends at the stopdepth (exlusive) if specified. Revisions found + earlier than the startdepth are omitted. """ - gen = _genrevancestors(repo, revs, followfirst, stopdepth) + gen = _genrevancestors(repo, revs, followfirst, startdepth, stopdepth) return generatorset(gen, iterasc=False) def revdescendants(repo, revs, followfirst):