Patchwork D7622: help: get helptext/ data from `resources` module if available

login
register
mail settings
Submitter phabricator
Date Dec. 12, 2019, 11:44 p.m.
Message ID <differential-rev-PHID-DREV-sqdl3oyvilzdrhlx2y4q-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/43766/
State Superseded
Headers show

Comments

phabricator - Dec. 12, 2019, 11:44 p.m.
martinvonz created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  For PyOxidizer, we need to read configs using the `resources`
  module. This patch makes it so we use that if available (i.e. Python
  
  > 3.7). It does that by adding a new `open_resource()` function to
  > ================================================================
  
  our `resourceutil` module.
  
  Tested by running `$PYTHON ./hg help pager` for each $PYTHON in
  {python2, python3.6, python3.7}.

REPOSITORY
  rHG Mercurial

BRANCH
  default

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

AFFECTED FILES
  mercurial/defaultrc/__init__.py
  mercurial/help.py
  mercurial/utils/resourceutil.py

CHANGE DETAILS

diff --git a/mercurial/defaultrc/__init__.py b/mercurial/defaultrc/__init__.py
new file mode 100644



To: martinvonz, #hg-reviewers
Cc: mercurial-devel
phabricator - Dec. 13, 2019, 4:35 a.m.
mharbison72 added inline comments.

INLINE COMMENTS

> resourceutil.py:45
> +
> +    def open_resouce(package, name):
> +        package = b'mercurial.' + package

s/open_resouce/open_resource/

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D7622/new/

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

To: martinvonz, #hg-reviewers, indygreg
Cc: mharbison72, mercurial-devel
phabricator - Dec. 13, 2019, 8:01 a.m.
martinvonz added inline comments.
martinvonz marked an inline comment as done.

INLINE COMMENTS

> mharbison72 wrote in resourceutil.py:45
> s/open_resouce/open_resource/

Oops, done.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D7622/new/

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

To: martinvonz, #hg-reviewers, indygreg
Cc: mharbison72, mercurial-devel
phabricator - Dec. 15, 2019, 12:34 a.m.
This revision is now accepted and ready to land.
indygreg added a comment.
indygreg accepted this revision.


  This seems like a reasonable and lightweight implementation of resource reading!

REPOSITORY
  rHG Mercurial

BRANCH
  default

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D7622/new/

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

To: martinvonz, #hg-reviewers, indygreg
Cc: mharbison72, mercurial-devel

Patch

diff --git a/mercurial/utils/resourceutil.py b/mercurial/utils/resourceutil.py
--- a/mercurial/utils/resourceutil.py
+++ b/mercurial/utils/resourceutil.py
@@ -35,3 +35,25 @@ 
     datapath = os.path.dirname(pycompat.sysexecutable)
 else:
     datapath = os.path.dirname(os.path.dirname(pycompat.fsencode(__file__)))
+
+try:
+    import importlib
+
+    # Force loading of the resources module
+    importlib.resources.open_binary
+
+    def open_resouce(package, name):
+        package = b'mercurial.' + package
+        return importlib.resources.open_binary(
+            pycompat.sysstr(package), pycompat.sysstr(name)
+        )
+
+
+except AttributeError:
+
+    def _package_path(package):
+        return os.path.join(datapath, *package.split(b'.'))
+
+    def open_resouce(package, name):
+        path = os.path.join(_package_path(package), name)
+        return open(path, 'rb')
diff --git a/mercurial/help.py b/mercurial/help.py
--- a/mercurial/help.py
+++ b/mercurial/help.py
@@ -8,7 +8,6 @@ 
 from __future__ import absolute_import
 
 import itertools
-import os
 import re
 import textwrap
 
@@ -314,11 +313,11 @@ 
     """Return a delayed loader for help/topic.txt."""
 
     def loader(ui):
-        docdir = os.path.join(resourceutil.datapath, b'helptext')
+        package = b'helptext'
         if subdir:
-            docdir = os.path.join(docdir, subdir)
-        path = os.path.join(docdir, topic + b".txt")
-        doc = gettext(util.readfile(path))
+            package = b'helptext' + b'.' + subdir
+        with resourceutil.open_resouce(package, topic + b'.txt') as fp:
+            doc = gettext(fp.read())
         for rewriter in helphooks.get(topic, []):
             doc = rewriter(ui, topic, doc)
         return doc