hgdemandimport/__init__.py
author Matt Harbison <matt_harbison@yahoo.com>
Thu, 20 Sep 2018 17:27:01 -0700
changeset 40324 6637b079ae45
parent 37843 670eb4fa1b86
child 43076 2372284d9457
permissions -rw-r--r--
lfs: autoload the extension when cloning from repo with lfs enabled This is based on a patch by Gregory Szorc. I made small adjustments to clean up the messaging when the server has the extension enabled, but the client has it disabled (to prevent autoloading). Additionally, I added a second server capability to distinguish between the server having the extension enabled, and the server having LFS commits. This helps prevent unnecessary requirement propagation- the client shouldn't add a requirement that the server doesn't have, just because the server had the extension loaded. The TODO I had about advertising a capability when the server can natively serve up blobs isn't relevant anymore (we've had 2 releases that support this), so I dropped it. Currently, we lazily add the "lfs" requirement to a repo when we first encounter LFS data. Due to a pretxnchangegroup hook that looks for LFS data, this can happen at the end of clone. Now that we have more control over how repositories are created, we can do better. This commit adds a repo creation option to add the "lfs" requirement. hg.clone() sets this creation option if the remote peer is advertising lfs usage (as opposed to just support needed to push). So, what this change effectively does is have cloned repos automatically inherit the "lfs" requirement. Differential Revision: https://phab.mercurial-scm.org/D5130
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()