diff mercurial/templater.py @ 36985:255f635c3204

templater: convert resources to a table of callables for future extension I'm going to add a full templating support to the annotate command. As the annotate is a filectx-oriented command, we'll need a way to look up a ctx from a bounded fctx only when necessary. This is the minimal change to support that. I'm thinking of defining a proper interface to look up template resources to fix other issues, but that isn't ready yet. (Changes from V1: just updated tests and patch descriptions.)
author Yuya Nishihara <yuya@tcha.org>
date Sun, 11 Mar 2018 21:05:29 +0900
parents 521f6c7e1756
children 036e4483d3a1
line wrap: on
line diff
--- a/mercurial/templater.py	Sat Mar 17 21:46:17 2018 -0400
+++ b/mercurial/templater.py	Sun Mar 11 21:05:29 2018 +0900
@@ -566,8 +566,8 @@
         v = None
         if key in self._resources:
             v = mapping.get(key)
-        if v is None:
-            v = self._resources.get(key)
+        if v is None and key in self._resources:
+            v = self._resources[key](self, mapping, key)
         if v is None:
             raise templateutil.ResourceUnavailable(
                 _('template resource not available: %s') % key)
@@ -670,8 +670,9 @@
         - ``filters``: a dict of functions to transform a value into another.
         - ``defaults``: a dict of symbol values/functions; may be overridden
           by a ``mapping`` dict.
-        - ``resources``: a dict of internal data (e.g. cache), inaccessible
-          from user template; may be overridden by a ``mapping`` dict.
+        - ``resources``: a dict of functions returning internal data
+          (e.g. cache), inaccessible from user template; may be overridden by
+          a ``mapping`` dict.
         - ``cache``: a dict of preloaded template fragments.
         - ``aliases``: a list of alias (name, replacement) pairs.
 
@@ -691,7 +692,7 @@
         self.filters = templatefilters.filters.copy()
         self.filters.update(filters)
         self.defaults = defaults
-        self._resources = {'templ': self}
+        self._resources = {'templ': lambda context, mapping, key: self}
         self._resources.update(resources)
         self._aliases = aliases
         self.minchunk, self.maxchunk = minchunk, maxchunk