Patchwork D8891: templater: start passing resource to read from into _readmapfile()

login
register
mail settings
Submitter phabricator
Date Aug. 5, 2020, 4:26 p.m.
Message ID <differential-rev-PHID-DREV-amzlzfn5zl4hqf5lq667-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/46990/
State Superseded
Headers show

Comments

phabricator - Aug. 5, 2020, 4:26 p.m.
martinvonz created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  This patch makes it so we pass in a file-like resource to read from
  instead of having `_readmapfile()` open the file. This is one more
  step towards making `_readmapfile()` able to read resources opened by
  from `importlib.resources`. We still need to pass in the mapfile path
  because it's used for loading dependent mapfiles from `%include` and
  `__base__`, and it's also used for giving the user better error
  messages. Besides that, one can safely call `_readmapfile()` with any
  file-like resource after this patch.

REPOSITORY
  rHG Mercurial

BRANCH
  default

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

AFFECTED FILES
  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
@@ -814,14 +814,17 @@ 
     return b", ".join(sorted(stylelist))
 
 
-def _readmapfile(mapfile):
+def _open_mapfile(mapfile):
+    if os.path.exists(mapfile):
+        return util.posixfile(mapfile, b'rb')
+    raise error.Abort(
+        _(b"style '%s' not found") % mapfile,
+        hint=_(b"available styles: %s") % stylelist(),
+    )
+
+
+def _readmapfile(fp, mapfile):
     """Load template elements from the given map file"""
-    if not os.path.exists(mapfile):
-        raise error.Abort(
-            _(b"style '%s' not found") % mapfile,
-            hint=_(b"available styles: %s") % stylelist(),
-        )
-
     base = os.path.dirname(mapfile)
     conf = config.config()
 
@@ -838,7 +841,7 @@ 
                 )
                 break
 
-    data = util.posixfile(mapfile, b'rb').read()
+    data = fp.read()
     conf.parse(mapfile, data, remap={b'': b'templates'}, include=include)
 
     cache = {}
@@ -862,7 +865,8 @@ 
                     if os.path.isfile(p3):
                         path = p3
 
-        cache, tmap, aliases = _readmapfile(path)
+        fp = _open_mapfile(path)
+        cache, tmap, aliases = _readmapfile(fp, path)
 
     for key, val in conf[b'templates'].items():
         if not val:
@@ -999,7 +1003,8 @@ 
     ):
         """Create templater from the specified map file"""
         t = cls(filters, defaults, resources, cache, [], minchunk, maxchunk)
-        cache, tmap, aliases = _readmapfile(mapfile)
+        fp = _open_mapfile(mapfile)
+        cache, tmap, aliases = _readmapfile(fp, mapfile)
         t._loader.cache.update(cache)
         t._loader._map = tmap
         t._loader._aliasmap = _aliasrules.buildmap(aliases)