~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugin.py

Fixed deletion handling

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2004, 2005 Canonical Ltd
2
 
#
 
1
# Copyright (C) 2004, 2005 by 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
42
43
import os
43
44
import sys
44
 
 
45
 
from bzrlib.lazy_import import lazy_import
46
 
lazy_import(globals(), """
47
 
import imp
48
45
import types
49
46
 
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
 
 
 
47
import bzrlib
 
48
from bzrlib.config import config_dir
 
49
from bzrlib.trace import log_error, mutter, log_exception, 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')
70
56
 
71
57
_loaded = False
72
58
 
74
60
def all_plugins():
75
61
    """Return a dictionary of the plugins."""
76
62
    result = {}
77
 
    for name, plugin in plugins.__dict__.items():
 
63
    for name, plugin in bzrlib.plugins.__dict__.items():
78
64
        if isinstance(plugin, types.ModuleType):
79
65
            result[name] = plugin
80
66
    return result
106
92
    if _loaded:
107
93
        # People can make sure plugins are loaded, they just won't be twice
108
94
        return
 
95
        #raise BzrError("plugins already initialized")
109
96
    _loaded = True
110
97
 
111
 
    dirs = os.environ.get('BZR_PLUGIN_PATH',
112
 
                          get_default_plugin_path()).split(os.pathsep)
 
98
    dirs = os.environ.get('BZR_PLUGIN_PATH', DEFAULT_PLUGIN_PATH).split(os.pathsep)
113
99
    dirs.insert(0, os.path.dirname(plugins.__file__))
114
100
 
115
101
    load_from_dirs(dirs)
125
111
    Plugins are loaded into bzrlib.plugins.NAME, and can be found there
126
112
    for future reference.
127
113
    """
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]
 
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']
134
122
    for d in dirs:
135
123
        if not d:
136
124
            continue
139
127
        if not os.path.isdir(d):
140
128
            continue
141
129
        for f in os.listdir(d):
142
 
            path = osutils.pathjoin(d, f)
 
130
            path = pathjoin(d, f)
143
131
            if os.path.isdir(path):
144
132
                for entry in package_entries:
145
133
                    # This directory should be a package, and thus added to
146
134
                    # the list
147
 
                    if os.path.isfile(osutils.pathjoin(path, entry)):
 
135
                    if os.path.isfile(pathjoin(path, entry)):
148
136
                        break
149
137
                else: # This directory is not a package
150
138
                    continue
151
139
            else:
152
 
                for suffix_info in imp.get_suffixes():
 
140
                for suffix_info in suffixes:
153
141
                    if f.endswith(suffix_info[0]):
154
142
                        f = f[:-len(suffix_info[0])]
155
143
                        if suffix_info[2] == imp.C_EXTENSION and f.endswith('module'):
157
145
                        break
158
146
                else:
159
147
                    continue
160
 
            if getattr(plugins, f, None):
 
148
            if getattr(bzrlib.plugins, f, None):
161
149
                mutter('Plugin name %s already loaded', f)
162
150
            else:
163
151
                mutter('add plugin name %s', f)
172
160
                try:
173
161
                    plugin = imp.load_module('bzrlib.plugins.' + name,
174
162
                                             *plugin_info)
175
 
                    setattr(plugins, name, plugin)
 
163
                    setattr(bzrlib.plugins, name, plugin)
176
164
                finally:
177
165
                    if plugin_info[0] is not None:
178
166
                        plugin_info[0].close()