~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugin.py

  • Committer: Martin Pool
  • Date: 2009-03-13 07:46:26 UTC
  • mto: This revision was merged to the branch mainline in revision 4189.
  • Revision ID: mbp@sourcefrog.net-20090313074626-i3ycz4wubq6nbiuw
Remove APIs deprecated up to and including 1.6

Show diffs side-by-side

added added

removed removed

Lines of Context:
41
41
import imp
42
42
import re
43
43
import types
44
 
import zipfile
45
44
 
46
45
from bzrlib import (
47
46
    _format_version_tuple,
53
52
from bzrlib import plugins as _mod_plugins
54
53
""")
55
54
 
56
 
from bzrlib.symbol_versioning import deprecated_function, one_three
 
55
from bzrlib.symbol_versioning import deprecated_function
57
56
 
58
57
 
59
58
DEFAULT_PLUGIN_PATH = None
254
253
                trace.print_exception(sys.exc_info(), sys.stderr)
255
254
 
256
255
 
257
 
@deprecated_function(one_three)
258
 
def load_from_zip(zip_name):
259
 
    """Load all the plugins in a zip."""
260
 
    valid_suffixes = ('.py', '.pyc', '.pyo')    # only python modules/packages
261
 
                                                # is allowed
262
 
    try:
263
 
        index = zip_name.rindex('.zip')
264
 
    except ValueError:
265
 
        return
266
 
    archive = zip_name[:index+4]
267
 
    prefix = zip_name[index+5:]
268
 
 
269
 
    trace.mutter('Looking for plugins in %r', zip_name)
270
 
 
271
 
    # use zipfile to get list of files/dirs inside zip
272
 
    try:
273
 
        z = zipfile.ZipFile(archive)
274
 
        namelist = z.namelist()
275
 
        z.close()
276
 
    except zipfile.error:
277
 
        # not a valid zip
278
 
        return
279
 
 
280
 
    if prefix:
281
 
        prefix = prefix.replace('\\','/')
282
 
        if prefix[-1] != '/':
283
 
            prefix += '/'
284
 
        ix = len(prefix)
285
 
        namelist = [name[ix:]
286
 
                    for name in namelist
287
 
                    if name.startswith(prefix)]
288
 
 
289
 
    trace.mutter('Names in archive: %r', namelist)
290
 
    
291
 
    for name in namelist:
292
 
        if not name or name.endswith('/'):
293
 
            continue
294
 
    
295
 
        # '/' is used to separate pathname components inside zip archives
296
 
        ix = name.rfind('/')
297
 
        if ix == -1:
298
 
            head, tail = '', name
299
 
        else:
300
 
            head, tail = name.rsplit('/',1)
301
 
        if '/' in head:
302
 
            # we don't need looking in subdirectories
303
 
            continue
304
 
    
305
 
        base, suffix = osutils.splitext(tail)
306
 
        if suffix not in valid_suffixes:
307
 
            continue
308
 
    
309
 
        if base == '__init__':
310
 
            # package
311
 
            plugin_name = head
312
 
        elif head == '':
313
 
            # module
314
 
            plugin_name = base
315
 
        else:
316
 
            continue
317
 
    
318
 
        if not plugin_name:
319
 
            continue
320
 
        if getattr(_mod_plugins, plugin_name, None):
321
 
            trace.mutter('Plugin name %s already loaded', plugin_name)
322
 
            continue
323
 
    
324
 
        try:
325
 
            exec "import bzrlib.plugins.%s" % plugin_name in {}
326
 
            trace.mutter('Load plugin %s from zip %r', plugin_name, zip_name)
327
 
        except KeyboardInterrupt:
328
 
            raise
329
 
        except Exception, e:
330
 
            ## import pdb; pdb.set_trace()
331
 
            trace.warning('Unable to load plugin %r from %r'
332
 
                    % (name, zip_name))
333
 
            trace.log_exception_quietly()
334
 
            if 'error' in debug.debug_flags:
335
 
                trace.print_exception(sys.exc_info(), sys.stderr)
336
 
 
337
 
 
338
256
def plugins():
339
257
    """Return a dictionary of the plugins.
340
258