[Request] [+-- ] D8810: templater: handle None returned from templatedir()

martinvonz (Martin von Zweigbergk) phabricator at mercurial-scm.org
Fri Jul 24 21:48:21 UTC 2020


martinvonz created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  My recent 91aa9bba3dc9 <https://phab.mercurial-scm.org/rHG91aa9bba3dc9869762896607cf6bacd84de2c59b> (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.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D8810

AFFECTED FILES
  mercurial/debugcommands.py
  mercurial/hgweb/hgwebdir_mod.py
  mercurial/templater.py

CHANGE DETAILS

diff --git a/mercurial/templater.py b/mercurial/templater.py
--- a/mercurial/templater.py
+++ b/mercurial/templater.py
@@ -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)
diff --git a/mercurial/hgweb/hgwebdir_mod.py b/mercurial/hgweb/hgwebdir_mod.py
--- a/mercurial/hgweb/hgwebdir_mod.py
+++ b/mercurial/hgweb/hgwebdir_mod.py
@@ -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()
diff --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py
--- a/mercurial/debugcommands.py
+++ b/mercurial/debugcommands.py
@@ -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")



To: martinvonz, #hg-reviewers
Cc: mercurial-patches, mercurial-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mercurial-scm.org/pipermail/mercurial-patches/attachments/20200724/bb08e61e/attachment-0001.html>


More information about the Mercurial-patches mailing list