# HG changeset patch # User Yuya Nishihara # Date 1528375691 -32400 # Node ID 34ecc0a09c76d31b5a3edaa86c934761a22da64f # Parent 20dbca5817272e8beb5c6228d3ca781a5ae9a97d formatter: populate ctx from repo and node value This will basically replace the fm.contexthint() API. I originally thought this would be too complicated, and I wrote 8399438bc7ef "formatter: provide hint of context keys required by template" because of that. However, I had to add a similar mechanism for fctx templates, and the overall machinery became way simpler than my original patch. The test output slightly changed as {author} is no longer available in the {manifest} context, which isn't the point this test targeted on. diff -r 20dbca581727 -r 34ecc0a09c76 mercurial/formatter.py --- a/mercurial/formatter.py Fri Sep 14 18:18:46 2018 -0400 +++ b/mercurial/formatter.py Thu Jun 07 21:48:11 2018 +0900 @@ -579,8 +579,10 @@ if self._hasnodespec(origmapping) and self._hasnodespec(newmapping): orignode = templateutil.runsymbol(context, origmapping, 'node') mapping['originalnode'] = orignode - # put marker to override 'fctx' in mapping if any, and flag + # put marker to override 'ctx'/'fctx' in mapping if any, and flag # its existence to be reported by availablekeys() + if 'ctx' not in newmapping and self._hasliteral(newmapping, 'node'): + mapping['ctx'] = _placeholder if 'fctx' not in newmapping and self._hasliteral(newmapping, 'path'): mapping['fctx'] = _placeholder return mapping @@ -606,6 +608,16 @@ """Test if context revision is set or unset in the given mapping""" return 'node' in mapping or 'ctx' in mapping + def _loadctx(self, mapping): + repo = self._getsome(mapping, 'repo') + node = self._getliteral(mapping, 'node') + if repo is None or node is None: + return + try: + return repo[node] + except error.RepoLookupError: + return None # maybe hidden/non-existent node + def _loadfctx(self, mapping): ctx = self._getsome(mapping, 'ctx') path = self._getliteral(mapping, 'path') @@ -617,6 +629,7 @@ return None # maybe removed file? _loadermap = { + 'ctx': _loadctx, 'fctx': _loadfctx, } diff -r 20dbca581727 -r 34ecc0a09c76 mercurial/templatekw.py --- a/mercurial/templatekw.py Fri Sep 14 18:18:46 2018 -0400 +++ b/mercurial/templatekw.py Thu Jun 07 21:48:11 2018 +0900 @@ -481,8 +481,6 @@ mhex = hex(mnode) mapping = context.overlaymap(mapping, {'rev': mrev, 'node': mhex}) f = context.process('manifest', mapping) - # TODO: perhaps 'ctx' should be dropped from mapping because manifest - # rev and node are completely different from changeset's. return templateutil.hybriditem(f, None, f, lambda x: {'rev': mrev, 'node': mhex}) diff -r 20dbca581727 -r 34ecc0a09c76 tests/test-template-keywords.t --- a/tests/test-template-keywords.t Fri Sep 14 18:18:46 2018 -0400 +++ b/tests/test-template-keywords.t Thu Jun 07 21:48:11 2018 +0900 @@ -58,6 +58,11 @@ $ hg log -r 'wdir()' -T '{manifest}\n' +Changectx-derived keywords are disabled within {manifest} as {node} changes: + + $ hg log -r0 -T 'outer:{p1node} {manifest % "inner:{p1node}"}\n' + outer:0000000000000000000000000000000000000000 inner: + Check that {phase} works correctly on parents: $ cat << EOF > parentphase diff -r 20dbca581727 -r 34ecc0a09c76 tests/test-template-map.t --- a/tests/test-template-map.t Fri Sep 14 18:18:46 2018 -0400 +++ b/tests/test-template-map.t Thu Jun 07 21:48:11 2018 +0900 @@ -1756,5 +1756,5 @@ $ hg -R latesttag log -r tip --style=style1989 M|test - 11,test + 11, branch: test