Mercurial > public > mercurial-scm > hg
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 |
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) |