diff mercurial/formatter.py @ 39623:34ecc0a09c76

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.
author Yuya Nishihara <yuya@tcha.org>
date Thu, 07 Jun 2018 21:48:11 +0900
parents b1239aeef4d9
children 713085b45810
line wrap: on
line diff
--- 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,
     }