diff -r 1f81f680912f -r 7cd5c0968139 mercurial/templatefuncs.py --- a/mercurial/templatefuncs.py Sun Mar 15 16:00:45 2020 +0900 +++ b/mercurial/templatefuncs.py Sun Mar 15 16:11:58 2020 +0900 @@ -16,6 +16,7 @@ ) from . import ( color, + dagop, diffutil, encoding, error, @@ -842,6 +843,45 @@ return b'' +@templatefunc( + b'subsetparents(rev, revset)', + argspec=b'rev revset', + requires={b'repo', b'cache'}, +) +def subsetparents(context, mapping, args): + """Look up parents of the rev in the sub graph given by the revset.""" + if b'rev' not in args or b'revset' not in args: + # i18n: "subsetparents" is a keyword + raise error.ParseError(_(b"subsetparents expects two arguments")) + + repo = context.resource(mapping, b'repo') + + rev = templateutil.evalinteger(context, mapping, args[b'rev']) + + # TODO: maybe subsetparents(rev) should be allowed. the default revset + # will be the revisions specified by -rREV argument. + q = templateutil.evalwrapped(context, mapping, args[b'revset']) + if not isinstance(q, templateutil.revslist): + # i18n: "subsetparents" is a keyword + raise error.ParseError(_(b"subsetparents expects a queried revset")) + subset = q.tovalue(context, mapping) + key = q.cachekey + + if key: + # cache only if revset query isn't dynamic + cache = context.resource(mapping, b'cache') + walkercache = cache.setdefault(b'subsetparentswalker', {}) + if key in walkercache: + walker = walkercache[key] + else: + walker = dagop.subsetparentswalker(repo, subset) + walkercache[key] = walker + else: + # for one-shot use, specify startrev to limit the search space + walker = dagop.subsetparentswalker(repo, subset, startrev=rev) + return templateutil.revslist(repo, walker.parentsset(rev)) + + @templatefunc(b'word(number, text[, separator])') def word(context, mapping, args): """Return the nth word from a string."""