--- 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."""