changeset 45213:d5ccc059fbcd

templater: handle None returned from templatedir() My recent 91aa9bba3dc9 (templater: make templatepaths() return a single path, or None, 2020-07-21) didn't account for the fact that `templatedir()` returns `None` in frozen binaries. That is ironic, since the reason I'm working on this is to add support for built-in mapfiles in frozen binaries. This patch updates the callers to handle the `None` case. It's somewhat ugly, but I will have to revisit this soon anyway, since my goal is to make all callers handle that case by trying to read the map file using the resources API instead. Differential Revision: https://phab.mercurial-scm.org/D8810
author Martin von Zweigbergk <martinvonz@google.com>
date Fri, 24 Jul 2020 11:24:59 -0700
parents 4ccd5ec565c2
children a253ded5b03d
files mercurial/debugcommands.py mercurial/hgweb/hgwebdir_mod.py mercurial/templater.py
diffstat 3 files changed, 34 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/debugcommands.py	Wed Jul 22 00:09:17 2020 -0700
+++ b/mercurial/debugcommands.py	Fri Jul 24 11:24:59 2020 -0700
@@ -1669,7 +1669,7 @@
 
     # templates
     p = templater.templatedir()
-    fm.write(b'templatedirs', b'checking templates (%s)...\n', p)
+    fm.write(b'templatedirs', b'checking templates (%s)...\n', p or b'')
     fm.condwrite(not p, b'', _(b" no template directories found\n"))
     if p:
         m = templater.templatepath(b"map-cmdline.default")
--- a/mercurial/hgweb/hgwebdir_mod.py	Wed Jul 22 00:09:17 2020 -0700
+++ b/mercurial/hgweb/hgwebdir_mod.py	Fri Jul 24 11:24:59 2020 -0700
@@ -415,7 +415,8 @@
                 static = self.ui.config(b"web", b"static", untrusted=False)
                 if not static:
                     tp = self.templatepath or templater.templatedir()
-                    static = [os.path.join(tp, b'static')]
+                    if tp is not None:
+                        static = [os.path.join(tp, b'static')]
 
                 staticfile(static, fname, res)
                 return res.sendresponse()
--- a/mercurial/templater.py	Wed Jul 22 00:09:17 2020 -0700
+++ b/mercurial/templater.py	Fri Jul 24 11:24:59 2020 -0700
@@ -828,6 +828,8 @@
     def include(rel, abs, remap, sections):
         templatedirs = [base, templatedir()]
         for dir in templatedirs:
+            if dir is None:
+                continue
             abs = os.path.normpath(os.path.join(dir, rel))
             if os.path.isfile(abs):
                 data = util.posixfile(abs, b'rb').read()
@@ -850,13 +852,15 @@
 
         # fallback check in template paths
         if not os.path.exists(path):
-            p2 = util.normpath(os.path.join(templatedir(), val))
-            if os.path.isfile(p2):
-                path = p2
-            else:
-                p3 = util.normpath(os.path.join(p2, b"map"))
-                if os.path.isfile(p3):
-                    path = p3
+            dir = templatedir()
+            if dir is not None:
+                p2 = util.normpath(os.path.join(dir, val))
+                if os.path.isfile(p2):
+                    path = p2
+                else:
+                    p3 = util.normpath(os.path.join(p2, b"map"))
+                    if os.path.isfile(p3):
+                        path = p3
 
         cache, tmap, aliases = _readmapfile(path)
 
@@ -1064,6 +1068,9 @@
 
 def templatepath(name):
     '''return location of template file. returns None if not found.'''
+    dir = templatedir()
+    if dir is None:
+        return None
     f = os.path.join(templatedir(), name)
     if f and os.path.exists(f):
         return f
@@ -1085,22 +1092,23 @@
     if isinstance(styles, bytes):
         styles = [styles]
 
-    for style in styles:
-        # only plain name is allowed to honor template paths
-        if (
-            not style
-            or style in (pycompat.oscurdir, pycompat.ospardir)
-            or pycompat.ossep in style
-            or pycompat.osaltsep
-            and pycompat.osaltsep in style
-        ):
-            continue
-        locations = [os.path.join(style, b'map'), b'map-' + style]
-        locations.append(b'map')
+    if path is not None:
+        for style in styles:
+            # only plain name is allowed to honor template paths
+            if (
+                not style
+                or style in (pycompat.oscurdir, pycompat.ospardir)
+                or pycompat.ossep in style
+                or pycompat.osaltsep
+                and pycompat.osaltsep in style
+            ):
+                continue
+            locations = [os.path.join(style, b'map'), b'map-' + style]
+            locations.append(b'map')
 
-        for location in locations:
-            mapfile = os.path.join(path, location)
-            if os.path.isfile(mapfile):
-                return style, mapfile
+            for location in locations:
+                mapfile = os.path.join(path, location)
+                if os.path.isfile(mapfile):
+                    return style, mapfile
 
     raise RuntimeError(b"No hgweb templates found in %r" % path)