# HG changeset patch # User Martin von Zweigbergk # Date 1595615099 25200 # Node ID d5ccc059fbcd3e4af53a1556231113089dba7b0e # Parent 4ccd5ec565c2baaa1d598b20a7ea14d3c4fd39dc 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 diff -r 4ccd5ec565c2 -r d5ccc059fbcd mercurial/debugcommands.py --- 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") diff -r 4ccd5ec565c2 -r d5ccc059fbcd mercurial/hgweb/hgwebdir_mod.py --- 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() diff -r 4ccd5ec565c2 -r d5ccc059fbcd mercurial/templater.py --- 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)