hgdemandimport/__init__.py
author Georges Racinet <gracinet@anybox.fr>
Thu, 27 Sep 2018 16:55:44 +0200
changeset 40298 9cadb0f5f227
parent 37843 670eb4fa1b86
child 43076 2372284d9457
permissions -rw-r--r--
rust: hooking into Python code We introduce a new class called 'rustlazyancestors' in the ancestors module, which is used only if parsers.rustlazyancestors does exist. The implementation of __contains__ stays unchanged, but is now backed by the Rust iterator. It would probably be a good candidate for further development, though, as it is mostly looping, and duplicates the 'seen' set. The Rust code could be further optimized, however it already gives rise to performance improvements: median timing from hg perfancestors: - on pypy: before: 0.077566s after: 0.016676s -79% - on mozilla central: before: 0.190037s after: 0.082225s -58% - on a private repository (about one million revisions): before: 0.567085s after: 0.108816s -80% - on another private repository (about 400 000 revisions): before: 1.440918s after: 0.290116s -80% median timing for hg perfbranchmap base - on pypy: before: 1.383413s after: 0.507993s -63% - on mozilla central: before: 2.821940s after: 1.258902s -55% - on a private repository (about one million revisions): before: 77.065076s after: 16.158475s -80% - on another private repository (about 401 000 revisions): before: 7.835503s after: 3.545331s -54%
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32420
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
from __future__ import absolute_import
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
    15
33859
8fb5212652ec demandimport: move HGDEMANDIMPORT test to __init__.py
Jun Wu <quark@fb.com>
parents: 32423
diff changeset
    16
import os
32422
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    17
import sys
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    18
32423
859496bb6db3 demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents: 32422
diff changeset
    19
if sys.version_info[0] >= 3:
859496bb6db3 demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents: 32422
diff changeset
    20
    from . import demandimportpy3 as demandimport
859496bb6db3 demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents: 32422
diff changeset
    21
else:
859496bb6db3 demandimport: add python 3 implementation
Siddharth Agarwal <sid0@fb.com>
parents: 32422
diff changeset
    22
    from . import demandimportpy2 as demandimport
32420
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
    23
37843
670eb4fa1b86 demandimport: make module ignores a set (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33860
diff changeset
    24
# Full module names which can't be lazy imported.
670eb4fa1b86 demandimport: make module ignores a set (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33860
diff changeset
    25
# Extensions can add to this set.
670eb4fa1b86 demandimport: make module ignores a set (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33860
diff changeset
    26
IGNORES = {
32422
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    27
    '__future__',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    28
    '_hashlib',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    29
    # ImportError during pkg_resources/__init__.py:fixup_namespace_package
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    30
    '_imp',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    31
    '_xmlplus',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    32
    'fcntl',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    33
    'nt', # pathlib2 tests the existence of built-in 'nt' module
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    34
    'win32com.gen_py',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    35
    'win32com.shell', # 'appdirs' tries to import win32com.shell
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    36
    '_winreg', # 2.7 mimetypes needs immediate ImportError
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    37
    'pythoncom',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    38
    # imported by tarfile, not available under Windows
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    39
    'pwd',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    40
    'grp',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    41
    # imported by profile, itself imported by hotshot.stats,
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    42
    # not available under Windows
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    43
    'resource',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    44
    # this trips up many extension authors
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    45
    'gtk',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    46
    # setuptools' pkg_resources.py expects "from __main__ import x" to
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    47
    # raise ImportError if x not defined
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    48
    '__main__',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    49
    '_ssl', # conditional imports in the stdlib, issue1964
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    50
    '_sre', # issue4920
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    51
    'rfc822',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    52
    'mimetools',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    53
    'sqlalchemy.events', # has import-time side effects (issue5085)
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    54
    # 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: 32420
diff changeset
    55
    'distutils.msvc9compiler',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    56
    '__builtin__',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    57
    'builtins',
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    58
    'urwid.command_map', # for pudb
37843
670eb4fa1b86 demandimport: make module ignores a set (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33860
diff changeset
    59
}
32422
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    60
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    61
_pypy = '__pypy__' in sys.builtin_module_names
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    62
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    63
if _pypy:
37843
670eb4fa1b86 demandimport: make module ignores a set (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33860
diff changeset
    64
    # _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: 33860
diff changeset
    65
    IGNORES.add('_ctypes.pointer')
32422
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    66
37843
670eb4fa1b86 demandimport: make module ignores a set (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33860
diff changeset
    67
demandimport.init(IGNORES)
32422
f37f9499fea8 demandimport: move ignore list to __init__.py
Siddharth Agarwal <sid0@fb.com>
parents: 32420
diff changeset
    68
32420
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
    69
# Re-export.
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
    70
isenabled = demandimport.isenabled
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
    71
disable = demandimport.disable
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
    72
deactivated = demandimport.deactivated
33859
8fb5212652ec demandimport: move HGDEMANDIMPORT test to __init__.py
Jun Wu <quark@fb.com>
parents: 32423
diff changeset
    73
8fb5212652ec demandimport: move HGDEMANDIMPORT test to __init__.py
Jun Wu <quark@fb.com>
parents: 32423
diff changeset
    74
def enable():
33860
3cfc9070245f demandimport: disable if chg is being used
Jun Wu <quark@fb.com>
parents: 33859
diff changeset
    75
    # chg pre-imports modules so do not enable demandimport for it
3cfc9070245f demandimport: disable if chg is being used
Jun Wu <quark@fb.com>
parents: 33859
diff changeset
    76
    if ('CHGINTERNALMARK' not in os.environ
3cfc9070245f demandimport: disable if chg is being used
Jun Wu <quark@fb.com>
parents: 33859
diff changeset
    77
        and os.environ.get('HGDEMANDIMPORT') != 'disable'):
33859
8fb5212652ec demandimport: move HGDEMANDIMPORT test to __init__.py
Jun Wu <quark@fb.com>
parents: 32423
diff changeset
    78
        demandimport.enable()