annotate mercurial/policy.py @ 52049:af54626bf358

dirstate-map: add a missing debug wait point when accessing the v2 docket fc8e37c380d3 added synchronization points to the dirstate to allow for race condition testing without actually requiring a time-based race condition to happen. This changes adds the `pre-read-file` wait point before we read the docket, since callers might ask for the parents before anything else is read, leading to the first read being done before the wait point. This removes some differences in test output which were presumed to be speed related, but weren't.
author Rapha?l Gom?s <rgomes@octobus.net>
date Mon, 14 Oct 2024 14:14:21 +0200
parents 5e2f0fec0a47
children 6673cec8605c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
51859
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 51727
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
51720
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
diff changeset
12 import typing
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
diff changeset
13
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
diff changeset
14 if typing.TYPE_CHECKING:
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
diff changeset
15 from typing import (
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
diff changeset
16 Dict,
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
diff changeset
17 Optional,
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
diff changeset
18 Tuple,
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
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.
51720
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
diff changeset
35 policy: bytes = b'allow'
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
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:
51727
92845af308b4 typing: narrow the scope of some recent disabled import warnings
Matt Harbison <matt_harbison@yahoo.com>
parents: 51720
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
51720
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
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:
51720
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
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.
51953
f3bef5eb12f9 module-policy: ignore empty module policy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50926
diff changeset
63 if os.environ.get('HGMODULEPOLICY'): # ignore None and Empty
51720
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
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
51720
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
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
51720
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
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
51720
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
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
51720
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
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
51720
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
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
51720
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
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
51720
a3dc962cac62 typing: add type hints to `mercurial.policy`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51698
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)