39
39
# That could be either a separate Python interpreter or perhaps a new
40
40
# namespace inside this interpreter.
45
from bzrlib.lazy_import import lazy_import
46
lazy_import(globals(), """
48
from bzrlib.config import config_dir
49
from bzrlib.trace import log_error, mutter, warning, \
51
from bzrlib.errors import BzrError
52
from bzrlib import plugins
53
from bzrlib.osutils import pathjoin
55
DEFAULT_PLUGIN_PATH = pathjoin(config_dir(), 'plugins')
57
from bzrlib.trace import mutter, warning, log_exception_quietly
60
DEFAULT_PLUGIN_PATH = None
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
93
107
# People can make sure plugins are loaded, they just won't be twice
95
#raise BzrError("plugins already initialized")
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__))
101
115
load_from_dirs(dirs)
104
119
def load_from_dirs(dirs):
125
140
if not os.path.isdir(d):
127
142
for f in os.listdir(d):
128
path = pathjoin(d, f)
143
path = osutils.pathjoin(d, f)
129
144
if os.path.isdir(path):
130
145
for entry in package_entries:
131
146
# This directory should be a package, and thus added to
133
if os.path.isfile(pathjoin(path, entry)):
148
if os.path.isfile(osutils.pathjoin(path, entry)):
135
150
else: # This directory is not a package
146
if getattr(bzrlib.plugins, f, None):
161
if getattr(plugins, f, None):
147
162
mutter('Plugin name %s already loaded', f)
149
mutter('add plugin name %s', f)
164
# mutter('add plugin name %s', f)
150
165
plugin_names.add(f)
152
167
plugin_names = list(plugin_names)
154
169
for name in plugin_names:
156
171
plugin_info = imp.find_module(name, [d])
157
mutter('load plugin %r', plugin_info)
172
# mutter('load plugin %r', plugin_info)
159
174
plugin = imp.load_module('bzrlib.plugins.' + name,
161
setattr(bzrlib.plugins, name, plugin)
176
setattr(plugins, name, plugin)
163
178
if plugin_info[0] is not None:
164
179
plugin_info[0].close()
166
mutter('loaded succesfully')
180
# mutter('loaded succesfully')
167
181
except KeyboardInterrupt:
169
183
except Exception, e:
170
184
## import pdb; pdb.set_trace()
171
185
warning('Unable to load plugin %r from %r' % (name, d))
172
186
log_exception_quietly()
189
def load_from_zips(zips):
190
"""Load bzr plugins from zip archives with zipimport.
191
It's similar to load_from_dirs but plugins searched inside archives.
196
valid_suffixes = ('.py', '.pyc', '.pyo') # only python modules/packages
198
for zip_name in zips:
199
if '.zip' not in zip_name:
202
ziobj = zipimport.zipimporter(zip_name)
203
except zipimport.ZipImportError:
206
mutter('Looking for plugins in %r', zip_name)
208
# use zipfile to get list of files/dirs inside zip
209
z = zipfile.ZipFile(ziobj.archive)
210
namelist = z.namelist()
214
prefix = ziobj.prefix.replace('\\','/')
216
namelist = [name[ix:]
218
if name.startswith(prefix)]
220
mutter('Names in archive: %r', namelist)
222
for name in namelist:
223
if not name or name.endswith('/'):
226
# '/' is used to separate pathname components inside zip archives
229
head, tail = '', name
231
head, tail = name.rsplit('/',1)
233
# we don't need looking in subdirectories
236
base, suffix = osutils.splitext(tail)
237
if suffix not in valid_suffixes:
240
if base == '__init__':
251
if getattr(plugins, plugin_name, None):
252
mutter('Plugin name %s already loaded', plugin_name)
256
plugin = ziobj.load_module(plugin_name)
257
setattr(plugins, plugin_name, plugin)
258
mutter('Load plugin %s from zip %r', plugin_name, zip_name)
259
except zipimport.ZipImportError, e:
260
mutter('Unable to load plugin %r from %r: %s',
261
plugin_name, zip_name, str(e))
263
except KeyboardInterrupt:
266
## import pdb; pdb.set_trace()
267
warning('Unable to load plugin %r from %r'
269
log_exception_quietly()