diff -r fcdff048a8e5 -r e54bfde922f2 mercurial/revset.py --- a/mercurial/revset.py Thu Dec 13 00:18:47 2018 -0500 +++ b/mercurial/revset.py Thu Dec 13 17:18:57 2018 +0800 @@ -218,6 +218,15 @@ def relationset(repo, subset, x, y, order): raise error.ParseError(_("can't use a relation in this context")) +def generationsrel(repo, subset, x, rel, n, order): + # TODO: support range, rewrite tests, and drop startdepth argument + # from ancestors() and descendants() predicates + if n <= 0: + n = -n + return _ancestors(repo, subset, x, startdepth=n, stopdepth=n + 1) + else: + return _descendants(repo, subset, x, startdepth=n, stopdepth=n + 1) + def relsubscriptset(repo, subset, x, y, z, order): # this is pretty basic implementation of 'x#y[z]' operator, still # experimental so undocumented. see the wiki for further ideas. @@ -225,17 +234,11 @@ rel = getsymbol(y) n = getinteger(z, _("relation subscript must be an integer")) - # TODO: perhaps this should be a table of relation functions - if rel in ('g', 'generations'): - # TODO: support range, rewrite tests, and drop startdepth argument - # from ancestors() and descendants() predicates - if n <= 0: - n = -n - return _ancestors(repo, subset, x, startdepth=n, stopdepth=n + 1) - else: - return _descendants(repo, subset, x, startdepth=n, stopdepth=n + 1) + if rel in subscriptrelations: + return subscriptrelations[rel](repo, subset, x, rel, n, order) - raise error.UnknownIdentifier(rel, ['generations']) + relnames = [r for r in subscriptrelations.keys() if len(r) > 1] + raise error.UnknownIdentifier(rel, relnames) def subscriptset(repo, subset, x, y, order): raise error.ParseError(_("can't use a subscript in this context")) @@ -2215,6 +2218,11 @@ "parentpost": parentpost, } +subscriptrelations = { + "g": generationsrel, + "generations": generationsrel, +} + def lookupfn(repo): return lambda symbol: scmutil.isrevsymbol(repo, symbol)