Mercurial > public > mercurial-scm > hg-stable
diff mercurial/revset.py @ 33019: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 | d83b189aef83 |
line wrap: on
line diff
--- a/mercurial/revset.py Sun Jun 18 00:22:41 2017 +0900 +++ b/mercurial/revset.py Sun Jun 18 00:40:58 2017 +0900 @@ -238,11 +238,12 @@ return baseset([anc.rev()]) return baseset() -def _ancestors(repo, subset, x, followfirst=False, stopdepth=None): +def _ancestors(repo, subset, x, followfirst=False, startdepth=None, + stopdepth=None): heads = getset(repo, fullreposet(repo), x) if not heads: return baseset() - s = dagop.revancestors(repo, heads, followfirst, stopdepth) + s = dagop.revancestors(repo, heads, followfirst, startdepth, stopdepth) return subset & s @predicate('ancestors(set[, depth])', safe=True) @@ -253,18 +254,26 @@ If depth is specified, the result only includes changesets up to the specified generation. """ - args = getargsdict(x, 'ancestors', 'set depth') + # startdepth is for internal use only until we can decide the UI + args = getargsdict(x, 'ancestors', 'set depth startdepth') if 'set' not in args: # i18n: "ancestors" is a keyword raise error.ParseError(_('ancestors takes at least 1 argument')) - stopdepth = None + startdepth = stopdepth = None + if 'startdepth' in args: + n = getinteger(args['startdepth'], + "ancestors expects an integer startdepth") + if n < 0: + raise error.ParseError("negative startdepth") + startdepth = n if 'depth' in args: # i18n: "ancestors" is a keyword n = getinteger(args['depth'], _("ancestors expects an integer depth")) if n < 0: raise error.ParseError(_("negative depth")) stopdepth = n + 1 - return _ancestors(repo, subset, args['set'], stopdepth=stopdepth) + return _ancestors(repo, subset, args['set'], + startdepth=startdepth, stopdepth=stopdepth) @predicate('_firstancestors', safe=True) def _firstancestors(repo, subset, x):