[PATCH 1 of 4] formatter: populate ctx from repo and node value
Yuya Nishihara
yuya at tcha.org
Fri Sep 14 14:00:21 UTC 2018
# HG changeset patch
# User Yuya Nishihara <yuya at tcha.org>
# Date 1528375691 -32400
# Thu Jun 07 21:48:11 2018 +0900
# Node ID 04148415f749c0c0345af335ce2d55ba8168e380
# Parent a2880ac67ee0c497973d69fd7e8bafe22268ce4f
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 --git a/mercurial/formatter.py b/mercurial/formatter.py
--- a/mercurial/formatter.py
+++ b/mercurial/formatter.py
@@ -579,8 +579,10 @@ class templateresources(templater.resour
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 @@ class templateresources(templater.resour
"""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 @@ class templateresources(templater.resour
return None # maybe removed file?
_loadermap = {
+ 'ctx': _loadctx,
'fctx': _loadfctx,
}
diff --git a/mercurial/templatekw.py b/mercurial/templatekw.py
--- a/mercurial/templatekw.py
+++ b/mercurial/templatekw.py
@@ -481,8 +481,6 @@ def showmanifest(context, mapping):
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 --git a/tests/test-template-keywords.t b/tests/test-template-keywords.t
--- a/tests/test-template-keywords.t
+++ b/tests/test-template-keywords.t
@@ -58,6 +58,11 @@ never cause crash:
$ 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 --git a/tests/test-template-map.t b/tests/test-template-map.t
--- a/tests/test-template-map.t
+++ b/tests/test-template-map.t
@@ -1756,5 +1756,5 @@ Test recursive showlist template (issue1
$ hg -R latesttag log -r tip --style=style1989
M|test
- 11,test
+ 11,
branch: test
More information about the Mercurial-devel
mailing list