[PATCH 1 of 8] templater: add function that expands internal literal templates

Yuya Nishihara yuya at tcha.org
Thu Apr 5 14:37:19 UTC 2018


# HG changeset patch
# User Yuya Nishihara <yuya at tcha.org>
# Date 1521295009 -32400
#      Sat Mar 17 22:56:49 2018 +0900
# Node ID befd68a9bd8bb3ee4e450d20e6e7d279464f3f36
# Parent  d3286dd2ca2f9f9e2b332e00c4b25b21729c54f5
templater: add function that expands internal literal templates

This will be used when rendering nested formatter items with the default
template, e.g.

  fm.nested('parents', tmpl='{rev}:{node|formatnode}', sep=' ')
                             ^^^^^^^^^^^^^^^^^^^^^^^
                             the default item template

diff --git a/mercurial/templater.py b/mercurial/templater.py
--- a/mercurial/templater.py
+++ b/mercurial/templater.py
@@ -603,6 +603,7 @@ class engine(object):
         self._resources = resources
         self._aliasmap = _aliasrules.buildmap(aliases)
         self._cache = {}  # key: (func, data)
+        self._tmplcache = {}  # literal template: (func, data)
 
     def overlaymap(self, origmapping, newmapping):
         """Create combined mapping from the original mapping and partial
@@ -659,6 +660,13 @@ class engine(object):
                 raise
         return self._cache[t]
 
+    def _parse(self, tmpl):
+        """Parse and cache a literal template"""
+        if tmpl not in self._tmplcache:
+            x = parse(tmpl)
+            self._tmplcache[tmpl] = compileexp(x, self, methods)
+        return self._tmplcache[tmpl]
+
     def preload(self, t):
         """Load, parse, and cache the specified template if available"""
         try:
@@ -672,6 +680,18 @@ class engine(object):
         mapping contains added elements for use during expansion. Is a
         generator.'''
         func, data = self._load(t)
+        return self._expand(func, data, mapping)
+
+    def expand(self, tmpl, mapping):
+        """Perform expansion over a literal template
+
+        No user aliases will be expanded since this is supposed to be called
+        with an internal template string.
+        """
+        func, data = self._parse(tmpl)
+        return self._expand(func, data, mapping)
+
+    def _expand(self, func, data, mapping):
         # populate additional items only if they don't exist in the given
         # mapping. this is slightly different from overlaymap() because the
         # initial 'revcache' may contain pre-computed items.


More information about the Mercurial-devel mailing list