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