Mercurial > hg
view mercurial/utils/resourceutil.py @ 47072:4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Since the dawn of time, people have been forced to rely to lossy introspection
of the index filename to determine what the purpose and role of the revlog they
encounter is. This is hacky, error prone, inflexible, abstraction-leaky,
<insert-your-own-complaints-here>.
In f63299ee7e4d Raphaël introduced a new attribute to track this information:
`revlog_kind`. However it is initialized in an odd place and various instances
end up not having it set. In addition is only tracking some of the information
we end up having to introspect in various pieces of code.
So we add a new attribute that holds more data and is more strictly enforced.
This work is done in collaboration with Raphaël.
The `revlog_kind` one will be removed/adapted in the next changeset. We expect
to be able to clean up various existing piece of code and to simplify coming
work around the newer revlog format.
Differential Revision: https://phab.mercurial-scm.org/D10352
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 06 Apr 2021 05:20:24 +0200 |
parents | d4ba4d51f85f |
children | f3b1df44b716 |
line wrap: on
line source
# resourceutil.py - utility for looking up resources # # Copyright 2005 K. Thananchayan <thananck@yahoo.com> # Copyright 2005-2007 Olivia Mackall <olivia@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 import os 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") # new py2exe or pycompat.safehasattr(sys, "importers") # old py2exe or imp.is_frozen("__main__") # tools/freeze ) # the location of data files matching the source code if mainfrozen() and getattr(sys, "frozen", None) != "macosx_app": # executable version (py2exe) doesn't support __file__ datapath = os.path.dirname(pycompat.sysexecutable) _rootpath = datapath # 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): dirs = package.split(b".") assert dirs[0] == b"mercurial" return os.path.join(_rootpath, *dirs[1:]) else: datapath = os.path.dirname(os.path.dirname(pycompat.fsencode(__file__))) _rootpath = os.path.dirname(datapath) def _package_path(package): return os.path.join(_rootpath, *package.split(b".")) try: # importlib.resources exists from Python 3.7; see fallback in except clause # further down from importlib import resources from .. import encoding # Force loading of the resources module resources.open_binary # pytype: disable=module-attr def open_resource(package, name): return resources.open_binary( # pytype: disable=module-attr pycompat.sysstr(package), pycompat.sysstr(name) ) 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) except (ImportError, AttributeError): # importlib.resources was not found (almost definitely because we're on a # Python version before 3.7) def open_resource(package, name): path = os.path.join(_package_path(package), name) return open(path, "rb") 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 def contents(package): path = pycompat.fsdecode(_package_path(package)) for p in os.listdir(path): yield pycompat.fsencode(p)