mirror of
https://github.com/facebook/sapling.git
synced 2024-10-16 19:57:18 +03:00
584656dff3
Summary: Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`. Then run `arc lint` again so some other autofixers like spellchecker etc. looked at the code base. Manually accept the changes whenever they make sense, or use a workaround (ex. changing "dict()" to "dict constructor") where autofix is false positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less interesting to fix (hgsubversion tests), or cannot be fixed without breaking OSS build (FBPYTHON4). Conflicted linters (test-check-module-imports.t, part of test-check-code.t, test-check-pyflakes.t) are removed or disabled. Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed. An issue of the auto-formatter is lines are no longer guarnateed to be <= 80 chars. But that seems less important comparing with the benefit auto-formatter provides. As we're here, also remove test-check-py3-compat.t, as it is currently broken if `PYTHON3=/bin/python3` is set. Reviewed By: wez, phillco, simpkins, pkaush, singhsrb Differential Revision: D8173629 fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
124 lines
3.8 KiB
Python
124 lines
3.8 KiB
Python
# policy.py - module policy logic for Mercurial.
|
|
#
|
|
# Copyright 2015 Gregory Szorc <gregory.szorc@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 os
|
|
import sys
|
|
|
|
|
|
# Rules for how modules can be loaded. Values are:
|
|
#
|
|
# c - require C extensions
|
|
# allow - allow pure Python implementation when C loading fails
|
|
# cffi - required cffi versions (implemented within pure module)
|
|
# cffi-allow - allow pure Python implementation if cffi version is missing
|
|
# py - only load pure Python modules
|
|
#
|
|
# By default, fall back to the pure modules so the in-place build can
|
|
# run without recompiling the C extensions. This will be overridden by
|
|
# __modulepolicy__ generated by setup.py.
|
|
policy = b"allow"
|
|
_packageprefs = {
|
|
# policy: (versioned package, pure package)
|
|
b"c": (r"cext", None),
|
|
b"allow": (r"cext", r"pure"),
|
|
b"cffi": (r"cffi", None),
|
|
b"cffi-allow": (r"cffi", r"pure"),
|
|
b"py": (None, r"pure"),
|
|
}
|
|
|
|
try:
|
|
from . import __modulepolicy__
|
|
|
|
policy = __modulepolicy__.modulepolicy
|
|
except ImportError:
|
|
pass
|
|
|
|
# PyPy doesn't load C extensions.
|
|
#
|
|
# The canonical way to do this is to test platform.python_implementation().
|
|
# But we don't import platform and don't bloat for it here.
|
|
if r"__pypy__" in sys.builtin_module_names:
|
|
policy = b"cffi"
|
|
|
|
# Our C extensions aren't yet compatible with Python 3. So use pure Python
|
|
# on Python 3 for now.
|
|
if sys.version_info[0] >= 3:
|
|
policy = b"py"
|
|
|
|
# Environment variable can always force settings.
|
|
if sys.version_info[0] >= 3:
|
|
if r"HGMODULEPOLICY" in os.environ:
|
|
policy = os.environ[r"HGMODULEPOLICY"].encode(r"utf-8")
|
|
else:
|
|
policy = os.environ.get(r"HGMODULEPOLICY", policy)
|
|
|
|
|
|
def _importfrom(pkgname, modname):
|
|
# from .<pkgname> import <modname> (where . is looked through this module)
|
|
fakelocals = {}
|
|
pkg = __import__(pkgname, globals(), fakelocals, [modname], level=1)
|
|
try:
|
|
fakelocals[modname] = mod = getattr(pkg, modname)
|
|
except AttributeError:
|
|
raise ImportError(r"cannot import name %s" % modname)
|
|
# force import; fakelocals[modname] may be replaced with the real module
|
|
getattr(mod, r"__doc__", None)
|
|
return fakelocals[modname]
|
|
|
|
|
|
# keep in sync with "version" in C modules
|
|
_cextversions = {
|
|
(r"cext", r"base85"): 1,
|
|
(r"cext", r"bdiff"): 1,
|
|
(r"cext", r"diffhelpers"): 1,
|
|
(r"cext", r"mpatch"): 1,
|
|
(r"cext", r"osutil"): 2,
|
|
(r"cext", r"parsers"): 4,
|
|
}
|
|
|
|
# map import request to other package or module
|
|
_modredirects = {
|
|
(r"cext", r"charencode"): (r"cext", r"parsers"),
|
|
(r"cffi", r"base85"): (r"pure", r"base85"),
|
|
(r"cffi", r"charencode"): (r"pure", r"charencode"),
|
|
(r"cffi", r"diffhelpers"): (r"pure", r"diffhelpers"),
|
|
(r"cffi", r"parsers"): (r"pure", r"parsers"),
|
|
}
|
|
|
|
|
|
def _checkmod(pkgname, modname, mod):
|
|
expected = _cextversions.get((pkgname, modname))
|
|
actual = getattr(mod, r"version", None)
|
|
if actual != expected:
|
|
raise ImportError(
|
|
r"cannot import module %s.%s "
|
|
r"(expected version: %d, actual: %r)" % (pkgname, modname, expected, actual)
|
|
)
|
|
|
|
|
|
def importmod(modname):
|
|
"""Import module according to policy and check API version"""
|
|
try:
|
|
verpkg, purepkg = _packageprefs[policy]
|
|
except KeyError:
|
|
raise ImportError(r"invalid HGMODULEPOLICY %r" % policy)
|
|
assert verpkg or purepkg
|
|
if verpkg:
|
|
pn, mn = _modredirects.get((verpkg, modname), (verpkg, modname))
|
|
try:
|
|
mod = _importfrom(pn, mn)
|
|
if pn == verpkg:
|
|
_checkmod(pn, mn, mod)
|
|
return mod
|
|
except ImportError:
|
|
if not purepkg:
|
|
raise
|
|
pn, mn = _modredirects.get((purepkg, modname), (purepkg, modname))
|
|
return _importfrom(pn, mn)
|