2052.3.1
by John Arbash Meinel
Add tests to cleanup the copyright of all source files |
1 |
# Copyright (C) 2005, 2006 Canonical Ltd
|
1996.3.11
by John Arbash Meinel
Hack around loading 'copy' to make startup much faster |
2 |
#
|
3 |
# This program is free software; you can redistribute it and/or modify
|
|
4 |
# it under the terms of the GNU General Public License as published by
|
|
5 |
# the Free Software Foundation; either version 2 of the License, or
|
|
6 |
# (at your option) any later version.
|
|
7 |
#
|
|
8 |
# This program is distributed in the hope that it will be useful,
|
|
9 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
11 |
# GNU General Public License for more details.
|
|
12 |
#
|
|
13 |
# You should have received a copy of the GNU General Public License
|
|
14 |
# along with this program; if not, write to the Free Software
|
|
15 |
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
16 |
||
17 |
"""A version of inspect that includes what 'copy' needs.
|
|
18 |
||
19 |
Importing the python standard module 'copy' is far more expensive than it
|
|
20 |
needs to be, because copy imports 'inspect' which imports 'tokenize'.
|
|
21 |
And 'copy' only needs 2 small functions out of 'inspect', but has to
|
|
22 |
load all of 'tokenize', which makes it horribly slow.
|
|
23 |
||
24 |
This module is designed to use tricky hacks in import rules, to avoid this
|
|
25 |
overhead.
|
|
26 |
"""
|
|
27 |
||
28 |
||
29 |
####
|
|
30 |
# These are the only 2 functions that 'copy' needs from 'inspect'
|
|
31 |
# As you can see, they are quite trivial, and don't justify the
|
|
32 |
# 40ms spent to import 'inspect' because it is importing 'tokenize'
|
|
33 |
# These are copied verbatim from the python standard library.
|
|
34 |
||
35 |
# ----------------------------------------------------------- class helpers
|
|
36 |
def _searchbases(cls, accum): |
|
37 |
# Simulate the "classic class" search order.
|
|
38 |
if cls in accum: |
|
39 |
return
|
|
40 |
accum.append(cls) |
|
41 |
for base in cls.__bases__: |
|
42 |
_searchbases(base, accum) |
|
43 |
||
44 |
||
45 |
def getmro(cls): |
|
46 |
"Return tuple of base classes (including cls) in method resolution order."
|
|
47 |
if hasattr(cls, "__mro__"): |
|
48 |
return cls.__mro__ |
|
49 |
else: |
|
50 |
result = [] |
|
51 |
_searchbases(cls, result) |
|
52 |
return tuple(result) |
|
53 |
||
54 |
||
55 |
def import_copy_with_hacked_inspect(): |
|
56 |
"""Import the 'copy' module with a hacked 'inspect' module"""
|
|
57 |
# We don't actually care about 'getmro' but we need to pass
|
|
58 |
# something in the list so that we get the direct module,
|
|
59 |
# rather than getting the base module
|
|
60 |
import sys |
|
61 |
||
62 |
# Don't hack around if 'inspect' already exists
|
|
63 |
if 'inspect' in sys.modules: |
|
64 |
import copy |
|
65 |
return
|
|
66 |
||
67 |
mod = __import__('bzrlib.inspect_for_copy', |
|
68 |
globals(), locals(), ['getmro']) |
|
69 |
||
70 |
sys.modules['inspect'] = mod |
|
71 |
try: |
|
72 |
import copy |
|
73 |
finally: |
|
74 |
del sys.modules['inspect'] |