~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugin.py

Optimize Tree._iter_changes with specific file_ids

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2004, 2005 by Canonical Ltd
2
 
 
 
1
# Copyright (C) 2004, 2005 Canonical Ltd
 
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
7
 
 
 
7
#
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
11
# GNU General Public License for more details.
12
 
 
 
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
39
39
# That could be either a separate Python interpreter or perhaps a new
40
40
# namespace inside this interpreter.
41
41
 
42
 
import imp
43
42
import os
44
43
import sys
 
44
 
 
45
from bzrlib.lazy_import import lazy_import
 
46
lazy_import(globals(), """
 
47
import imp
45
48
import types
46
49
 
47
 
import bzrlib
48
 
from bzrlib.config import config_dir
49
 
from bzrlib.trace import log_error, mutter, warning, \
50
 
        log_exception_quietly
51
 
from bzrlib.errors import BzrError
52
 
from bzrlib import plugins
53
 
from bzrlib.osutils import pathjoin
54
 
 
55
 
DEFAULT_PLUGIN_PATH = pathjoin(config_dir(), 'plugins')
 
50
from bzrlib import (
 
51
    config,
 
52
    osutils,
 
53
    plugins,
 
54
    )
 
55
""")
 
56
 
 
57
from bzrlib.trace import mutter, warning, log_exception_quietly
 
58
 
 
59
 
 
60
DEFAULT_PLUGIN_PATH = None
 
61
 
 
62
 
 
63
def get_default_plugin_path():
 
64
    """Get the DEFAULT_PLUGIN_PATH"""
 
65
    global DEFAULT_PLUGIN_PATH
 
66
    if DEFAULT_PLUGIN_PATH is None:
 
67
        DEFAULT_PLUGIN_PATH = osutils.pathjoin(config.config_dir(), 'plugins')
 
68
    return DEFAULT_PLUGIN_PATH
 
69
 
56
70
 
57
71
_loaded = False
58
72
 
60
74
def all_plugins():
61
75
    """Return a dictionary of the plugins."""
62
76
    result = {}
63
 
    for name, plugin in bzrlib.plugins.__dict__.items():
 
77
    for name, plugin in plugins.__dict__.items():
64
78
        if isinstance(plugin, types.ModuleType):
65
79
            result[name] = plugin
66
80
    return result
92
106
    if _loaded:
93
107
        # People can make sure plugins are loaded, they just won't be twice
94
108
        return
95
 
        #raise BzrError("plugins already initialized")
96
109
    _loaded = True
97
110
 
98
 
    dirs = os.environ.get('BZR_PLUGIN_PATH', DEFAULT_PLUGIN_PATH).split(os.pathsep)
 
111
    dirs = os.environ.get('BZR_PLUGIN_PATH',
 
112
                          get_default_plugin_path()).split(os.pathsep)
99
113
    dirs.insert(0, os.path.dirname(plugins.__file__))
100
114
 
101
115
    load_from_dirs(dirs)
111
125
    Plugins are loaded into bzrlib.plugins.NAME, and can be found there
112
126
    for future reference.
113
127
    """
114
 
    # The problem with imp.get_suffixes() is that it doesn't include
115
 
    # .pyo which is technically valid
116
 
    # It also means that "testmodule.so" will show up as both test and testmodule
117
 
    # though it is only valid as 'test'
118
 
    # but you should be careful, because "testmodule.py" loads as testmodule.
119
 
    suffixes = imp.get_suffixes()
120
 
    suffixes.append(('.pyo', 'rb', imp.PY_COMPILED))
121
 
    package_entries = ['__init__.py', '__init__.pyc', '__init__.pyo']
 
128
    # Get the list of valid python suffixes for __init__.py?
 
129
    # this includes .py, .pyc, and .pyo (depending on if we are running -O)
 
130
    # but it doesn't include compiled modules (.so, .dll, etc)
 
131
    valid_suffixes = [suffix for suffix, mod_type, flags in imp.get_suffixes()
 
132
                              if flags in (imp.PY_SOURCE, imp.PY_COMPILED)]
 
133
    package_entries = ['__init__'+suffix for suffix in valid_suffixes]
122
134
    for d in dirs:
123
135
        if not d:
124
136
            continue
127
139
        if not os.path.isdir(d):
128
140
            continue
129
141
        for f in os.listdir(d):
130
 
            path = pathjoin(d, f)
 
142
            path = osutils.pathjoin(d, f)
131
143
            if os.path.isdir(path):
132
144
                for entry in package_entries:
133
145
                    # This directory should be a package, and thus added to
134
146
                    # the list
135
 
                    if os.path.isfile(pathjoin(path, entry)):
 
147
                    if os.path.isfile(osutils.pathjoin(path, entry)):
136
148
                        break
137
149
                else: # This directory is not a package
138
150
                    continue
139
151
            else:
140
 
                for suffix_info in suffixes:
 
152
                for suffix_info in imp.get_suffixes():
141
153
                    if f.endswith(suffix_info[0]):
142
154
                        f = f[:-len(suffix_info[0])]
143
155
                        if suffix_info[2] == imp.C_EXTENSION and f.endswith('module'):
145
157
                        break
146
158
                else:
147
159
                    continue
148
 
            if getattr(bzrlib.plugins, f, None):
 
160
            if getattr(plugins, f, None):
149
161
                mutter('Plugin name %s already loaded', f)
150
162
            else:
151
 
                mutter('add plugin name %s', f)
 
163
                # mutter('add plugin name %s', f)
152
164
                plugin_names.add(f)
153
165
 
154
166
        plugin_names = list(plugin_names)
156
168
        for name in plugin_names:
157
169
            try:
158
170
                plugin_info = imp.find_module(name, [d])
159
 
                mutter('load plugin %r', plugin_info)
 
171
                # mutter('load plugin %r', plugin_info)
160
172
                try:
161
173
                    plugin = imp.load_module('bzrlib.plugins.' + name,
162
174
                                             *plugin_info)
163
 
                    setattr(bzrlib.plugins, name, plugin)
 
175
                    setattr(plugins, name, plugin)
164
176
                finally:
165
177
                    if plugin_info[0] is not None:
166
178
                        plugin_info[0].close()
167
 
 
168
 
                mutter('loaded succesfully')
 
179
                # mutter('loaded succesfully')
169
180
            except KeyboardInterrupt:
170
181
                raise
171
182
            except Exception, e: