Patchwork D8894: templater: make open_template() read from resources if in frozen binary

login
register
mail settings
Submitter phabricator
Date Aug. 5, 2020, 4:26 p.m.
Message ID <differential-rev-PHID-DREV-ue57oau7blpl2oyqrbjm-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/46991/
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 takes the number of failing tests with PyOxidizer from 87 to 72.

REPOSITORY
  rHG Mercurial

BRANCH
  default

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

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
@@ -1074,7 +1074,12 @@ 
 
 
 def open_template(name):
-    '''returns a file-like object for the given template, and its full path'''
+    '''returns a file-like object for the given template, and its full path
+
+    If the name is a relative path and we're in a frozen binary, the template
+    will be read from the mercurial.templates package instead. The returned path
+    will then be the relative path.
+    '''
     templatepath = templatedir()
     if templatepath is not None or os.path.isabs(name):
         f = os.path.join(templatepath, name)
@@ -1083,5 +1088,12 @@ 
         except EnvironmentError:
             return None, None
     else:
-        # TODO: read from resources here
-        return None, None
+        name_parts = pycompat.sysstr(name).split('/')
+        package_name = '.'.join(['mercurial', 'templates'] + name_parts[:-1])
+        try:
+            return (
+                name,
+                resourceutil.open_resource(package_name, name_parts[-1]),
+            )
+        except (ModuleNotFoundError, FileNotFoundError):
+            return None, None