/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to profile_imports.py

  • Committer: Breezy landing bot
  • Author(s): Colin Watson
  • Date: 2020-11-16 21:47:08 UTC
  • mfrom: (7521.1.1 remove-lp-workaround)
  • Revision ID: breezy.the.bot@gmail.com-20201116214708-jos209mgxi41oy15
Remove breezy.git workaround for bazaar.launchpad.net.

Merged from https://code.launchpad.net/~cjwatson/brz/remove-lp-workaround/+merge/393710

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 
18
18
"""A custom importer and regex compiler which logs time spent."""
19
19
 
 
20
import re
20
21
import sys
21
22
import time
22
23
 
23
24
 
24
 
import re
25
 
 
26
 
 
27
25
_parent_stack = []
28
26
_total_stack = {}
29
27
_info = {}
43
41
        _total_stack[_parent_stack[-1]].append(this_stack)
44
42
    _total_stack[this_stack] = []
45
43
    _parent_stack.append(this_stack)
46
 
    _info[this_stack] = [len(_parent_stack)-1, frame_name, frame_lineno, scope_name]
 
44
    _info[this_stack] = [len(_parent_stack) - 1, frame_name, frame_lineno,
 
45
                         scope_name]
47
46
 
48
47
    return this_stack
49
48
 
60
59
 
61
60
def log_stack_info(out_file, sorted=True, hide_fast=True):
62
61
    # Find all of the roots with import = 0
63
 
    out_file.write('%5s %5s %-40s @ %s:%s\n'
64
 
        % ('cum', 'inline', 'name', 'file', 'line'))
65
 
    todo = [(value[-1], key) for key,value in _info.iteritems() if value[0] == 0]
 
62
    out_file.write(
 
63
        '%5s %5s %-40s @ %s:%s\n'
 
64
        % ('cum', 'local', 'name', 'file', 'line'))
 
65
    todo = [(value[-1], key) for key, value in _info.items() if value[0] == 0]
66
66
 
67
67
    if sorted:
68
68
        todo.sort()
86
86
 
87
87
        # indent, cum_time, mod_time, name,
88
88
        # scope_name, frame_name, frame_lineno
89
 
        out_file.write('%5.1f %5.1f %-40s @ %s:%d\n'
90
 
            % (info[-1]*1000., mod_time*1000.,
91
 
               ('+'*info[0] + cur[1]),
92
 
               info[1], info[2]))
 
89
        out_file.write(
 
90
            '%5.1f %5.1f %-40s @ %s:%d\n' % (
 
91
                info[-1] * 1000., mod_time * 1000.,
 
92
                ('+' * info[0] + cur[1]), info[1], info[2]))
93
93
 
94
94
        if sorted:
95
95
            c_times.sort()
100
100
 
101
101
_real_import = __import__
102
102
 
103
 
def timed_import(name, globals=None, locals=None, fromlist=None, level=None):
 
103
def timed_import(name, globals=None, locals=None, fromlist=None, level=0):
104
104
    """Wrap around standard importer to log import time"""
105
105
    # normally there are 4, but if this is called as __import__ eg by
106
106
    # /usr/lib/python2.6/email/__init__.py then there may be only one
107
107
    # parameter
108
 
    # level is only passed by python2.6
109
 
 
 
108
    # level has different default between Python 2 and 3, but codebase
110
109
    if globals is None:
111
110
        # can't determine the scope name afaics; we could peek up the stack to
112
111
        # see where this is being called from, but it should be a rare case.
118
117
        if scope_name is None:
119
118
            scope_name = globals.keys()
120
119
        else:
121
 
            # Trim out paths before bzrlib
122
 
            loc = scope_name.find('bzrlib')
123
 
            if loc != -1:
124
 
                scope_name = scope_name[loc:]
125
 
            # For stdlib, trim out early paths
126
 
            loc = scope_name.find('python2.4')
 
120
            # Trim out paths before breezy
 
121
            loc = scope_name.find('breezy')
127
122
            if loc != -1:
128
123
                scope_name = scope_name[loc:]
129
124
 
150
145
    tstart = _timer()
151
146
    try:
152
147
        # Do the import
153
 
        mod = _real_import(name, globals, locals, fromlist)
 
148
        return _real_import(name, globals, locals, fromlist, level=level)
154
149
    finally:
155
 
        tload = _timer()-tstart
 
150
        tload = _timer() - tstart
156
151
        stack_finish(this, tload)
157
152
 
158
 
    return mod
 
153
 
 
154
def _repr_regexp(pattern, max_len=30):
 
155
    """Present regexp pattern for logging, truncating if over max_len."""
 
156
    if len(pattern) > max_len:
 
157
        return repr(pattern[:max_len - 3]) + "..."
 
158
    return repr(pattern)
159
159
 
160
160
 
161
161
_real_compile = re._compile
175
175
        frame = sys._getframe(5)
176
176
        frame_name = frame.f_globals.get('__name__', '<unknown>')
177
177
    frame_lineno = frame.f_lineno
178
 
    this = stack_add(extra+repr(args[0]), frame_name, frame_lineno)
 
178
    this = stack_add(extra + _repr_regexp(args[0]), frame_name, frame_lineno)
179
179
 
180
180
    tstart = _timer()
181
181
    try:
198
198
    """Remove the import and regex compile timing hooks."""
199
199
    __builtins__['__import__'] = _real_import
200
200
    re._compile = _real_compile
201