Patchwork D8810: templater: handle None returned from templatedir()

login
register
mail settings
Submitter phabricator
Date July 24, 2020, 9:48 p.m.
Message ID <differential-rev-PHID-DREV-2yfqcgzp44jttbems5cw-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/46880/
State Superseded
Headers show

Comments

phabricator - July 24, 2020, 9:48 p.m.
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




To: martinvonz, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

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")