Mercurial > hg
annotate mercurial/policy.py @ 51802:eb952b2d224c
scmutil: add `readrequires` next to `writerequires`
The code is copied from localrepo.py.
author | Arseniy Alekseyev <aalekseyev@janestreet.com> |
---|---|
date | Thu, 15 Aug 2024 14:53:17 +0100 |
parents | 92845af308b4 |
children | f4733654f144 |
rev | line source |
---|---|
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 |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
8 |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
9 import os |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
10 import sys |
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
11 import typing |
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
12 |
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
13 if typing.TYPE_CHECKING: |
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
14 from typing import ( |
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
15 Dict, |
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
16 Optional, |
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
17 Tuple, |
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
18 ) |
29266
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
19 |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
20 # Rules for how modules can be loaded. Values are: |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
21 # |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
22 # c - require C extensions |
42451
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
23 # rust+c - require Rust and C extensions |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
24 # 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
|
25 # for each |
29266
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
26 # 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
|
27 # cffi - required cffi versions (implemented within pure module) |
b4d117cee636
policy: add cffi policy for PyPy
Maciej Fijalkowski <fijall@gmail.com>
parents:
29266
diff
changeset
|
28 # cffi-allow - allow pure Python implementation if cffi version is missing |
29266
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
29 # py - only load pure Python modules |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
30 # |
32251
a04f5c651e52
policy: relax the default for in-place build
Yuya Nishihara <yuya@tcha.org>
parents:
32210
diff
changeset
|
31 # 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
|
32 # 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
|
33 # __modulepolicy__ generated by setup.py. |
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
34 policy: bytes = b'allow' |
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
35 _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
|
36 # 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
|
37 b'c': ('cext', None), |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
38 b'allow': ('cext', 'pure'), |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
39 b'cffi': ('cffi', None), |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
40 b'cffi-allow': ('cffi', 'pure'), |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
41 b'py': (None, 'pure'), |
42451
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
42 # 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
|
43 b'rust+c': ('cext', None), |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
44 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
|
45 } |
29490
b4d117cee636
policy: add cffi policy for PyPy
Maciej Fijalkowski <fijall@gmail.com>
parents:
29266
diff
changeset
|
46 |
29266
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
47 try: |
51731
92845af308b4
typing: narrow the scope of some recent disabled import warnings
Matt Harbison <matt_harbison@yahoo.com>
parents:
51724
diff
changeset
|
48 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
|
49 |
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
50 policy: bytes = __modulepolicy__.modulepolicy |
29266
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
51 except ImportError: |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
52 pass |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
53 |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
54 # PyPy doesn't load C extensions. |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
55 # |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
56 # The canonical way to do this is to test platform.python_implementation(). |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
57 # 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
|
58 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
|
59 policy: bytes = b'cffi' |
29266
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
60 |
b3a677c82a35
debuginstall: expose modulepolicy
timeless <timeless@mozdev.org>
parents:
diff
changeset
|
61 # 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
|
62 if 'HGMODULEPOLICY' in os.environ: |
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
63 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
|
64 |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
65 |
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
66 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
|
67 # 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
|
68 fakelocals = {} |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
69 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
|
70 try: |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
71 fakelocals[modname] = mod = getattr(pkg, modname) |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
72 except AttributeError: |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
73 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
|
74 # 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
|
75 getattr(mod, '__doc__', None) |
32366
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
76 return fakelocals[modname] |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
77 |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
78 |
32428
28b773aa3ff2
policy: define C module versions individually
Jun Wu <quark@fb.com>
parents:
32366
diff
changeset
|
79 # 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
|
80 _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
|
81 ('cext', 'base85'): 1, |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
82 ('cext', 'bdiff'): 3, |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
83 ('cext', 'mpatch'): 1, |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
84 ('cext', 'osutil'): 4, |
49820
3eac92509484
dirstate-entry: add `modified` property
Raphaël Gomès <rgomes@octobus.net>
parents:
48938
diff
changeset
|
85 ('cext', 'parsers'): 21, |
32428
28b773aa3ff2
policy: define C module versions individually
Jun Wu <quark@fb.com>
parents:
32366
diff
changeset
|
86 } |
28b773aa3ff2
policy: define C module versions individually
Jun Wu <quark@fb.com>
parents:
32366
diff
changeset
|
87 |
33760
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
88 # 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
|
89 _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
|
90 ('cext', 'charencode'): ('cext', 'parsers'), |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
91 ('cffi', 'base85'): ('pure', 'base85'), |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
92 ('cffi', 'charencode'): ('pure', 'charencode'), |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
93 ('cffi', 'parsers'): ('pure', 'parsers'), |
33760
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
94 } |
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
95 |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
96 |
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
97 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
|
98 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
|
99 actual = getattr(mod, 'version', None) |
32366
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
100 if actual != expected: |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
101 raise ImportError( |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
102 'cannot import module %s.%s ' |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
103 '(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
|
104 % (pkgname, modname, expected, actual) |
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
105 ) |
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
106 |
32366
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
107 |
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
108 def importmod(modname: str): |
32366
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
109 """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
|
110 try: |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
111 verpkg, purepkg = _packageprefs[policy] |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
112 except KeyError: |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
113 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
|
114 assert verpkg or purepkg |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
115 if verpkg: |
33760
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
116 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
|
117 try: |
33760
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
118 mod = _importfrom(pn, mn) |
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
119 if pn == verpkg: |
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
120 _checkmod(pn, mn, mod) |
32366
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
121 return mod |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
122 except ImportError: |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
123 if not purepkg: |
8e0327dae3f4
policy: add helper to import cext/pure module
Yuya Nishihara <yuya@tcha.org>
parents:
32251
diff
changeset
|
124 raise |
33760
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
125 pn, mn = _modredirects.get((purepkg, modname), (purepkg, modname)) |
cd2aca0808f8
policy: reroute proxy modules internally
Yuya Nishihara <yuya@tcha.org>
parents:
32514
diff
changeset
|
126 return _importfrom(pn, mn) |
42451
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
127 |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
128 |
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
129 def _isrustpermissive() -> bool: |
42451
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
130 """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
|
131 return policy.endswith(b'-allow') |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
132 |
43075
57875cf423c9
style: run a patched black on a subset of mercurial
Augie Fackler <augie@google.com>
parents:
42451
diff
changeset
|
133 |
51724
a3dc962cac62
typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents:
51702
diff
changeset
|
134 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
|
135 """Import Rust module according to policy and availability. |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
136 |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
137 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
|
138 |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
139 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
|
140 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
|
141 """ |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
142 if not policy.startswith(b'rust'): |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
143 return default |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
144 |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
145 try: |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
146 mod = _importfrom('rustext', modname) |
42451
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
147 except ImportError: |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
148 if _isrustpermissive(): |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
149 return default |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
150 raise |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
151 if member is None: |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
152 return mod |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
153 |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
154 try: |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
155 return getattr(mod, member) |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
156 except AttributeError: |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
157 if _isrustpermissive(): |
810f66b468cd
rust: module policy with importrust
Georges Racinet <georges.racinet@octobus.net>
parents:
42343
diff
changeset
|
158 return default |
43503
313e3a279828
cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents:
43103
diff
changeset
|
159 raise ImportError("Cannot import name %s" % member) |