# HG changeset patch # User Martin von Zweigbergk # Date 1576184233 28800 # Node ID 1390bb81163e535eea3feab07a99122a70eba68b # Parent 66af68d4c7512e27be09372bbfd229e2307fe005 help: get helptext/ data from `resources` module if available For PyOxidizer, we need to read configs using the `resources` module. This patch makes it so we use that module 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}. Differential Revision: https://phab.mercurial-scm.org/D7622 diff -r 66af68d4c751 -r 1390bb81163e mercurial/defaultrc/__init__.py diff -r 66af68d4c751 -r 1390bb81163e mercurial/help.py --- a/mercurial/help.py Thu Dec 12 10:26:09 2019 -0800 +++ b/mercurial/help.py Thu Dec 12 12:57:13 2019 -0800 @@ -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_resource(package, topic + b'.txt') as fp: + doc = gettext(fp.read()) for rewriter in helphooks.get(topic, []): doc = rewriter(ui, topic, doc) return doc diff -r 66af68d4c751 -r 1390bb81163e mercurial/utils/resourceutil.py --- a/mercurial/utils/resourceutil.py Thu Dec 12 10:26:09 2019 -0800 +++ b/mercurial/utils/resourceutil.py Thu Dec 12 12:57:13 2019 -0800 @@ -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_resource(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_resource(package, name): + path = os.path.join(_package_path(package), name) + return open(path, 'rb')