##// END OF EJS Templates
nodemap: add a function to read the data from disk...
nodemap: add a function to read the data from disk This changeset is small and mostly an excuse to introduce an API function reading the data from disk. Differential Revision: https://phab.mercurial-scm.org/D7836

File last commit:

r44723:aea79f41 default
r44790:6c07480d default
Show More
resourceutil.py
98 lines | 2.9 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>
# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
# 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.
from __future__ import absolute_import
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 (
pycompat.safehasattr(sys, "frozen")
or pycompat.safehasattr(sys, "importers") # new py2exe
or imp.is_frozen("__main__") # old py2exe
) # tools/freeze
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: use `from importlib import resources`...
r44407 from importlib import resources
Martin von Zweigbergk
help: get helptext/ data from `resources` module if available...
r44323
Matt Harbison
resourceutil: implement `is_resource()`...
r44480 from .. import encoding
Martin von Zweigbergk
help: get helptext/ data from `resources` module if available...
r44323 # Force loading of the resources module
Martin von Zweigbergk
resourceutil: use `from importlib import resources`...
r44407 resources.open_binary # pytype: disable=module-attr
Martin von Zweigbergk
help: get helptext/ data from `resources` module if available...
r44323
def open_resource(package, name):
Martin von Zweigbergk
resourceutil: use `from importlib import resources`...
r44407 return resources.open_binary( # pytype: disable=module-attr
Martin von Zweigbergk
help: get helptext/ data from `resources` module if available...
r44323 pycompat.sysstr(package), pycompat.sysstr(name)
)
Matt Harbison
resourceutil: implement `is_resource()`...
r44480 def is_resource(package, name):
return resources.is_resource(
pycompat.sysstr(package), encoding.strfromlocal(name)
)
Matt Harbison
resourceutil: implement `contents()` to iterate over resources in a package...
r44481 def contents(package):
for r in resources.contents(pycompat.sysstr(package)):
yield encoding.strtolocal(r)
Martin von Zweigbergk
help: get helptext/ data from `resources` module if available...
r44323
Martin von Zweigbergk
resourceutil: use `from importlib import resources`...
r44407 except (ImportError, AttributeError):
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)