##// END OF EJS Templates
path-suboption: deprecated specifying the attributes as bytes...
path-suboption: deprecated specifying the attributes as bytes The known suboptions have been updated, so we can deprecated passing bytes in case some extensions use them.

File last commit:

r51649:847f703a stable
r51802:35885dbd default
Show More
resourceutil.py
120 lines | 3.8 KiB | text/x-python | PythonLexer
Martin von Zweigbergk
procutil: move mainfrozen() to new resourceutil.py...
r44067 # resourceutil.py - utility for looking up resources
#
# Copyright 2005 K. Thananchayan <thananck@yahoo.com>
Raphaël Gomès
contributor: change mentions of mpm to olivia...
r47575 # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com>
Martin von Zweigbergk
procutil: move mainfrozen() to new resourceutil.py...
r44067 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
Mads Kiilerich
utils: imp module is removed in Python 3.12 - get is_frozen() from _imp...
r51649 import _imp
Martin von Zweigbergk
util: move definition of datapath to resourceutil...
r44068 import os
Martin von Zweigbergk
procutil: move mainfrozen() to new resourceutil.py...
r44067 import sys
from .. import pycompat
def mainfrozen():
"""return True if we are a frozen executable.
The code supports py2exe (most common, Windows only) and tools/freeze
(portable, not much used).
"""
return (
Manuel Jacob
resourceutil: fix location of line comments...
r45476 pycompat.safehasattr(sys, "frozen") # new py2exe
or pycompat.safehasattr(sys, "importers") # old py2exe
Mads Kiilerich
utils: imp module is removed in Python 3.12 - get is_frozen() from _imp...
r51649 or _imp.is_frozen("__main__") # tools/freeze
Manuel Jacob
resourceutil: fix location of line comments...
r45476 )
Martin von Zweigbergk
util: move definition of datapath to resourceutil...
r44068
# the location of data files matching the source code
Augie Fackler
resourceutil: blacken
r44723 if mainfrozen() and getattr(sys, "frozen", None) != "macosx_app":
Martin von Zweigbergk
util: move definition of datapath to resourceutil...
r44068 # executable version (py2exe) doesn't support __file__
datapath = os.path.dirname(pycompat.sysexecutable)
Matt Harbison
resourceutil: correct the root path for file based lookup under py2exe...
r44678 _rootpath = datapath
Matt Harbison
resourceutil: account for the non-resource-like file hierarchy under py2exe...
r44706
# The installers store the files outside of library.zip, like
# C:\Program Files\Mercurial\defaultrc\*.rc. This strips the
# leading "mercurial." off of the package name, so that these
# pseudo resources are found in their directory next to the
# executable.
def _package_path(package):
Augie Fackler
resourceutil: blacken
r44723 dirs = package.split(b".")
assert dirs[0] == b"mercurial"
Matt Harbison
resourceutil: account for the non-resource-like file hierarchy under py2exe...
r44706 return os.path.join(_rootpath, *dirs[1:])
Augie Fackler
resourceutil: blacken
r44723
Martin von Zweigbergk
util: move definition of datapath to resourceutil...
r44068 else:
datapath = os.path.dirname(os.path.dirname(pycompat.fsencode(__file__)))
Matt Harbison
resourceutil: don't limit resources to the `mercurial` package...
r44479 _rootpath = os.path.dirname(datapath)
Martin von Zweigbergk
help: get helptext/ data from `resources` module if available...
r44323
Matt Harbison
resourceutil: account for the non-resource-like file hierarchy under py2exe...
r44706 def _package_path(package):
Augie Fackler
resourceutil: blacken
r44723 return os.path.join(_rootpath, *package.split(b"."))
Matt Harbison
resourceutil: account for the non-resource-like file hierarchy under py2exe...
r44706
Martin von Zweigbergk
help: get helptext/ data from `resources` module if available...
r44323 try:
Martin von Zweigbergk
resourceutil: document when we expect to take the importlib.resouces code path...
r46024 # importlib.resources exists from Python 3.7; see fallback in except clause
# further down
Matt Harbison
typing: suppress an import-error warning in `mercurial/utils/resourceutil.py`...
r48821 from importlib import resources # pytype: disable=import-error
Martin von Zweigbergk
help: get helptext/ data from `resources` module if available...
r44323
# Force loading of the resources module
av6
resourceutil: start using importlib.resources.files() when possible...
r50838 if pycompat.safehasattr(resources, 'files'):
resources.files # pytype: disable=module-attr
else:
resources.open_binary # pytype: disable=module-attr
Martin von Zweigbergk
help: get helptext/ data from `resources` module if available...
r44323
Matt Harbison
resourceutil: force filesystem access to resources when using py2exe...
r49965 # py2exe raises an AssertionError if uses importlib.resources
if getattr(sys, "frozen", None) in ("console_exe", "windows_exe"):
raise ImportError
Martin von Zweigbergk
resourceutil: use `from importlib import resources`...
r44407 except (ImportError, AttributeError):
Martin von Zweigbergk
resourceutil: document when we expect to take the importlib.resouces code path...
r46024 # importlib.resources was not found (almost definitely because we're on a
# Python version before 3.7)
Martin von Zweigbergk
help: get helptext/ data from `resources` module if available...
r44323
def open_resource(package, name):
path = os.path.join(_package_path(package), name)
Augie Fackler
resourceutil: blacken
r44723 return open(path, "rb")
Matt Harbison
resourceutil: implement `is_resource()`...
r44480
def is_resource(package, name):
path = os.path.join(_package_path(package), name)
try:
return os.path.isfile(pycompat.fsdecode(path))
except (IOError, OSError):
return False
Matt Harbison
resourceutil: implement `contents()` to iterate over resources in a package...
r44481
def contents(package):
path = pycompat.fsdecode(_package_path(package))
for p in os.listdir(path):
yield pycompat.fsencode(p)
resources: narrow the try:except clause to minimum...
r48668
else:
from .. import encoding
def open_resource(package, name):
av6
resourceutil: start using importlib.resources.files() when possible...
r50838 if pycompat.safehasattr(resources, 'files'):
return (
resources.files( # pytype: disable=module-attr
pycompat.sysstr(package)
)
.joinpath(pycompat.sysstr(name))
.open('rb')
)
else:
return resources.open_binary( # pytype: disable=module-attr
pycompat.sysstr(package), pycompat.sysstr(name)
)
resources: narrow the try:except clause to minimum...
r48668
def is_resource(package, name):
return resources.is_resource( # pytype: disable=module-attr
pycompat.sysstr(package), encoding.strfromlocal(name)
)
def contents(package):
# pytype: disable=module-attr
for r in resources.contents(pycompat.sysstr(package)):
# pytype: enable=module-attr
yield encoding.strtolocal(r)