author | Matt Harbison <matt_harbison@yahoo.com> |
Wed, 25 Sep 2024 01:16:47 -0400 | |
changeset 51900 | 77a9c7d8a7ba |
parent 51863 | f4733654f144 |
child 51963 | 5e2f0fec0a47 |
permissions | -rw-r--r-- |
29266
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
1 |
# policy.py - module policy logic for Mercurial. |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
2 |
# |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
3 |
# Copyright 2015 Gregory Szorc <gregory.szorc@gmail.com> |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
4 |
# |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
5 |
# This software may be used and distributed according to the terms of the |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
6 |
# GNU General Public License version 2 or any later version. |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
7 |
|
51863
f4733654f144
typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents:
51731
diff
changeset
|
8 |
from __future__ import annotations |
29266
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
9 |
|
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
10 |
import os |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
11 |
import sys |
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
12 |
import typing |
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
13 |
|
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
14 |
if typing.TYPE_CHECKING: |
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
15 |
from typing import ( |
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
16 |
Dict, |
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
17 |
Optional, |
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
18 |
Tuple, |
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
19 |
) |
29266
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
20 |
|
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
21 |
# Rules for how modules can be loaded. Values are: |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
22 |
# |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
23 |
# c - require C extensions |
42451
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
24 |
# rust+c - require Rust and C extensions |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
25 |
# rust+c-allow - allow Rust and C extensions with fallback to pure Python |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
26 |
# for each |
29266
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
27 |
# allow - allow pure Python implementation when C loading fails |
29490
b4d117cee636
policy: add cffi policy for PyPy
Maciej Fijalkowski <fijall@gmail.com>
parents:
29266
diff
changeset
|
28 |
# cffi - required cffi versions (implemented within pure module) |
b4d117cee636
policy: add cffi policy for PyPy
Maciej Fijalkowski <fijall@gmail.com>
parents:
29266
diff
changeset
|
29 |
# cffi-allow - allow pure Python implementation if cffi version is missing |
29266
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
30 |
# py - only load pure Python modules |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
31 |
# |
32251
a04f5c651e52
policy: relax the default for in-place build
Yuya Nishihara <yuya@tcha.org>
parents:
32210
diff
changeset
|
32 |
# By default, fall back to the pure modules so the in-place build can |
a04f5c651e52
policy: relax the default for in-place build
Yuya Nishihara <yuya@tcha.org>
parents:
32210
diff
changeset
|
33 |
# run without recompiling the C extensions. This will be overridden by |
a04f5c651e52
policy: relax the default for in-place build
Yuya Nishihara <yuya@tcha.org>
parents:
32210
diff
changeset
|
34 |
# __modulepolicy__ generated by setup.py. |
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
35 |
policy: bytes = b'allow' |
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
36 |
_packageprefs: "Dict[bytes, Tuple[Optional[str], Optional[str]]]" = { |
32366
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
37 |
# policy: (versioned package, pure package) |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
38 |
b'c': ('cext', None), |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
39 |
b'allow': ('cext', 'pure'), |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
40 |
b'cffi': ('cffi', None), |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
41 |
b'cffi-allow': ('cffi', 'pure'), |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
42 |
b'py': (None, 'pure'), |
42451
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
43 |
# For now, rust policies impact importrust only |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
44 |
b'rust+c': ('cext', None), |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
45 |
b'rust+c-allow': ('cext', 'pure'), |
32366
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
46 |
} |
29490
b4d117cee636
policy: add cffi policy for PyPy
Maciej Fijalkowski <fijall@gmail.com>
parents:
29266
diff
changeset
|
47 |
|
29266
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
48 |
try: |
51731
92845af308b4
typing: narrow the scope of some recent disabled import warnings
Matt Harbison <matt_harbison@yahoo.com>
parents:
51724
diff
changeset
|
49 |
from . import __modulepolicy__ # pytype: disable=import-error |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
50 |
|
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
51 |
policy: bytes = __modulepolicy__.modulepolicy |
29266
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
52 |
except ImportError: |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
53 |
pass |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
54 |
|
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
55 |
# PyPy doesn't load C extensions. |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
56 |
# |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
57 |
# The canonical way to do this is to test platform.python_implementation(). |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
58 |
# But we don't import platform and don't bloat for it here. |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
59 |
if '__pypy__' in sys.builtin_module_names: |
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
60 |
policy: bytes = b'cffi' |
29266
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
61 |
|
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
62 |
# Environment variable can always force settings. |
48938
f98da1349212
policy: remove Python 2.7 compatibility code
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
63 |
if 'HGMODULEPOLICY' in os.environ: |
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
64 |
policy: bytes = os.environ['HGMODULEPOLICY'].encode('utf-8') |
32366
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
65 |
|
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
66 |
|
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
67 |
def _importfrom(pkgname: str, modname: str): |
32366
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
68 |
# from .<pkgname> import <modname> (where . is looked through this module) |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
69 |
fakelocals = {} |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
70 |
pkg = __import__(pkgname, globals(), fakelocals, [modname], level=1) |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
71 |
try: |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
72 |
fakelocals[modname] = mod = getattr(pkg, modname) |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
73 |
except AttributeError: |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
74 |
raise ImportError('cannot import name %s' % modname) |
32366
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
75 |
# force import; fakelocals[modname] may be replaced with the real module |
43103
c95b2f40db7c
py3: stop normalizing 2nd argument of *attr() to unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43089
diff
changeset
|
76 |
getattr(mod, '__doc__', None) |
32366
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
77 |
return fakelocals[modname] |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
78 |
|
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
79 |
|
32428
28b773aa3ff2
policy: define C module versions individually
Jun Wu <quark@fb.com>
parents:
32366
diff
changeset
|
80 |
# keep in sync with "version" in C modules |
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
81 |
_cextversions: "Dict[Tuple[str, str], int]" = { |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
82 |
('cext', 'base85'): 1, |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
83 |
('cext', 'bdiff'): 3, |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
84 |
('cext', 'mpatch'): 1, |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
85 |
('cext', 'osutil'): 4, |
49820
3eac92509484
dirstate-entry: add `modified` property
Raphaël Gomès <rgomes@octobus.net>
parents:
48938
diff
changeset
|
86 |
('cext', 'parsers'): 21, |
32428
28b773aa3ff2
policy: define C module versions individually
Jun Wu <quark@fb.com>
parents:
32366
diff
changeset
|
87 |
} |
28b773aa3ff2
policy: define C module versions individually
Jun Wu <quark@fb.com>
parents:
32366
diff
changeset
|
88 |
|
33760
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
89 |
# map import request to other package or module |
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
90 |
_modredirects: "Dict[Tuple[str, str], Tuple[str, str]]" = { |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
91 |
('cext', 'charencode'): ('cext', 'parsers'), |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
92 |
('cffi', 'base85'): ('pure', 'base85'), |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
93 |
('cffi', 'charencode'): ('pure', 'charencode'), |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
94 |
('cffi', 'parsers'): ('pure', 'parsers'), |
33760
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
95 |
} |
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
96 |
|
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
97 |
|
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
98 |
def _checkmod(pkgname: str, modname: str, mod) -> None: |
32511
2e431fb98c6b
policy: extend API version checks for cffi
Yuya Nishihara <yuya@tcha.org>
parents:
32428
diff
changeset
|
99 |
expected = _cextversions.get((pkgname, modname)) |
43103
c95b2f40db7c
py3: stop normalizing 2nd argument of *attr() to unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43089
diff
changeset
|
100 |
actual = getattr(mod, 'version', None) |
32366
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
101 |
if actual != expected: |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
102 |
raise ImportError( |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
103 |
'cannot import module %s.%s ' |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
104 |
'(expected version: %d, actual: %r)' |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
105 |
% (pkgname, modname, expected, actual) |
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
106 |
) |
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
107 |
|
32366
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
108 |
|
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
109 |
def importmod(modname: str): |
32366
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
110 |
"""Import module according to policy and check API version""" |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
111 |
try: |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
112 |
verpkg, purepkg = _packageprefs[policy] |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
113 |
except KeyError: |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
114 |
raise ImportError('invalid HGMODULEPOLICY %r' % policy) |
32366
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
115 |
assert verpkg or purepkg |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
116 |
if verpkg: |
33760
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
117 |
pn, mn = _modredirects.get((verpkg, modname), (verpkg, modname)) |
32366
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
118 |
try: |
33760
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
119 |
mod = _importfrom(pn, mn) |
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
120 |
if pn == verpkg: |
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
121 |
_checkmod(pn, mn, mod) |
32366
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
122 |
return mod |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
123 |
except ImportError: |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
124 |
if not purepkg: |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
125 |
raise |
33760
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
126 |
pn, mn = _modredirects.get((purepkg, modname), (purepkg, modname)) |
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
127 |
return _importfrom(pn, mn) |
42451
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
128 |
|
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
129 |
|
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
130 |
def _isrustpermissive() -> bool: |
42451
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
131 |
"""Assuming the policy is a Rust one, tell if it's permissive.""" |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
132 |
return policy.endswith(b'-allow') |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
133 |
|
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
134 |
|
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
135 |
def importrust(modname: str, member: "Optional[str]" = None, default=None): |
42451
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
136 |
"""Import Rust module according to policy and availability. |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
137 |
|
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
138 |
If policy isn't a Rust one, this returns `default`. |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
139 |
|
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
140 |
If either the module or its member is not available, this returns `default` |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
141 |
if policy is permissive and raises `ImportError` if not. |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
142 |
""" |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
143 |
if not policy.startswith(b'rust'): |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
144 |
return default |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
145 |
|
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
146 |
try: |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
147 |
mod = _importfrom('rustext', modname) |
42451
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
148 |
except ImportError: |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
149 |
if _isrustpermissive(): |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
150 |
return default |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
151 |
raise |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
152 |
if member is None: |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
153 |
return mod |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
154 |
|
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
155 |
try: |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
156 |
return getattr(mod, member) |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
157 |
except AttributeError: |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
158 |
if _isrustpermissive(): |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
159 |
return default |
43503
313e3a279828
cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents:
43103
diff
changeset
|
160 |
raise ImportError("Cannot import name %s" % member) |