hgdemandimport/__init__.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sat, 11 Jun 2022 00:56:50 +0200
changeset 49358 0540c1628fd4
parent 49287 127d33e63d1a
child 50725 80c8dcfb73c6
permissions -rw-r--r--
sparse: use None as the sparse matcher value when disabled This create a clear signal for when the feature is unused. We could also create an `alwaysmatcher`, but using None is more explicit, so I went for it.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32458
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
     1
# hgdemandimport - global demand-loading of modules for Mercurial
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
     2
#
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
     3
# Copyright 2017 Facebook Inc.
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
     4
#
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
     7
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
     8
'''demandimport - automatic demand-loading of modules'''
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
     9
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
    10
# This is in a separate package from mercurial because in Python 3,
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
    11
# demand loading is per-package. Keeping demandimport in the mercurial package
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
    12
# would disable demand loading for any modules in mercurial.
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
    13
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
    14
33880
8fb5212652ec demandimport: move HGDEMANDIMPORT test to __init__.py
Jun Wu <quark@fb.com>
parents: 32461
diff changeset
    15
import os
32460
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    16
import sys
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    17
49038
425585f057e0 demandimport: delete demandimportpy2 module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
    18
from . import demandimportpy3 as demandimport
32458
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
    19
37889
670eb4fa1b86 demandimport: make module ignores a set (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33881
diff changeset
    20
# Full module names which can't be lazy imported.
670eb4fa1b86 demandimport: make module ignores a set (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33881
diff changeset
    21
# Extensions can add to this set.
670eb4fa1b86 demandimport: make module ignores a set (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33881
diff changeset
    22
IGNORES = {
32460
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    23
    '__future__',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    24
    '_hashlib',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    25
    # ImportError during pkg_resources/__init__.py:fixup_namespace_package
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    26
    '_imp',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    27
    '_xmlplus',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    28
    'fcntl',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37889
diff changeset
    29
    'nt',  # pathlib2 tests the existence of built-in 'nt' module
32460
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    30
    'win32com.gen_py',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37889
diff changeset
    31
    'win32com.shell',  # 'appdirs' tries to import win32com.shell
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37889
diff changeset
    32
    '_winreg',  # 2.7 mimetypes needs immediate ImportError
32460
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    33
    'pythoncom',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    34
    # imported by tarfile, not available under Windows
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    35
    'pwd',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    36
    'grp',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    37
    # imported by profile, itself imported by hotshot.stats,
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    38
    # not available under Windows
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    39
    'resource',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    40
    # this trips up many extension authors
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    41
    'gtk',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    42
    # setuptools' pkg_resources.py expects "from __main__ import x" to
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    43
    # raise ImportError if x not defined
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    44
    '__main__',
45215
81b4e7c866ec hgdemandimport: bypass demandimport for _ast module (issue6407)
Augie Fackler <augie@google.com>
parents: 44841
diff changeset
    45
    '_ast',  # https://bugs.python.org/issue41631
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37889
diff changeset
    46
    '_ssl',  # conditional imports in the stdlib, issue1964
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37889
diff changeset
    47
    '_sre',  # issue4920
32460
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    48
    'rfc822',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    49
    'mimetools',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37889
diff changeset
    50
    'sqlalchemy.events',  # has import-time side effects (issue5085)
45222
07731064ac41 hgdemandimport: exclude more sqlalchemy modules
Ludovic Chabant <ludovic@chabant.com>
parents: 45215
diff changeset
    51
    'sqlalchemy.dialects',  # similar problems as above
32460
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    52
    # setuptools 8 expects this module to explode early when not on windows
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    53
    'distutils.msvc9compiler',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    54
    '__builtin__',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    55
    'builtins',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37889
diff changeset
    56
    'urwid.command_map',  # for pudb
44841
40120de810ba demandimport: ignore `lzma` module for demandimport
Manuel Jacob <me@manueljacob.de>
parents: 43076
diff changeset
    57
    'lzma',
37889
670eb4fa1b86 demandimport: make module ignores a set (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33881
diff changeset
    58
}
32460
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    59
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    60
_pypy = '__pypy__' in sys.builtin_module_names
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    61
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    62
if _pypy:
37889
670eb4fa1b86 demandimport: make module ignores a set (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33881
diff changeset
    63
    # _ctypes.pointer is shadowed by "from ... import pointer" (PyPy 5)
670eb4fa1b86 demandimport: make module ignores a set (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33881
diff changeset
    64
    IGNORES.add('_ctypes.pointer')
48885
fda7ec505dc5 demandimport: eagerly load msvcrt module on PyPy
Manuel Jacob <me@manueljacob.de>
parents: 45222
diff changeset
    65
    # pure Python module on PyPy, must be loaded to raise ModuleNotFoundError
fda7ec505dc5 demandimport: eagerly load msvcrt module on PyPy
Manuel Jacob <me@manueljacob.de>
parents: 45222
diff changeset
    66
    # on non-Windows platforms
fda7ec505dc5 demandimport: eagerly load msvcrt module on PyPy
Manuel Jacob <me@manueljacob.de>
parents: 45222
diff changeset
    67
    IGNORES.add('msvcrt')
32460
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    68
37889
670eb4fa1b86 demandimport: make module ignores a set (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33881
diff changeset
    69
demandimport.init(IGNORES)
32460
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32458
diff changeset
    70
32458
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
    71
# Re-export.
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
    72
isenabled = demandimport.isenabled
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
    73
disable = demandimport.disable
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
    74
deactivated = demandimport.deactivated
33880
8fb5212652ec demandimport: move HGDEMANDIMPORT test to __init__.py
Jun Wu <quark@fb.com>
parents: 32461
diff changeset
    75
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37889
diff changeset
    76
33880
8fb5212652ec demandimport: move HGDEMANDIMPORT test to __init__.py
Jun Wu <quark@fb.com>
parents: 32461
diff changeset
    77
def enable():
33881
3cfc9070245f demandimport: disable if chg is being used
Jun Wu <quark@fb.com>
parents: 33880
diff changeset
    78
    # chg pre-imports modules so do not enable demandimport for it
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37889
diff changeset
    79
    if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37889
diff changeset
    80
        'CHGINTERNALMARK' not in os.environ
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37889
diff changeset
    81
        and os.environ.get('HGDEMANDIMPORT') != 'disable'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37889
diff changeset
    82
    ):
33880
8fb5212652ec demandimport: move HGDEMANDIMPORT test to __init__.py
Jun Wu <quark@fb.com>
parents: 32461
diff changeset
    83
        demandimport.enable()