~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugin.py

  • Committer: Vincent Ladeuil
  • Date: 2007-07-15 11:24:18 UTC
  • mfrom: (2617 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2646.
  • Revision ID: v.ladeuil+lp@free.fr-20070715112418-9nn4n6esxv60ny4b
merge bzr.dev@1617

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2004, 2005 Canonical Ltd
 
1
# Copyright (C) 2004, 2005, 2007 Canonical Ltd
2
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
37
37
import imp
38
38
import re
39
39
import types
40
 
import zipimport
 
40
import zipfile
41
41
 
42
42
from bzrlib import (
43
43
    config,
194
194
    """Load all the plugins in a zip."""
195
195
    valid_suffixes = ('.py', '.pyc', '.pyo')    # only python modules/packages
196
196
                                                # is allowed
197
 
    if '.zip' not in zip_name:
198
 
        return
 
197
 
199
198
    try:
200
 
        ziobj = zipimport.zipimporter(zip_name)
201
 
    except zipimport.ZipImportError:
202
 
        # not a valid zip
 
199
        index = zip_name.rindex('.zip')
 
200
    except ValueError:
203
201
        return
 
202
    archive = zip_name[:index+4]
 
203
    prefix = zip_name[index+5:]
 
204
 
204
205
    mutter('Looking for plugins in %r', zip_name)
205
 
    
206
 
    import zipfile
207
206
 
208
207
    # use zipfile to get list of files/dirs inside zip
209
 
    z = zipfile.ZipFile(ziobj.archive)
210
 
    namelist = z.namelist()
211
 
    z.close()
212
 
    
213
 
    if ziobj.prefix:
214
 
        prefix = ziobj.prefix.replace('\\','/')
 
208
    try:
 
209
        z = zipfile.ZipFile(archive)
 
210
        namelist = z.namelist()
 
211
        z.close()
 
212
    except zipfile.error:
 
213
        # not a valid zip
 
214
        return
 
215
 
 
216
    if prefix:
 
217
        prefix = prefix.replace('\\','/')
 
218
        if prefix[-1] != '/':
 
219
            prefix += '/'
215
220
        ix = len(prefix)
216
221
        namelist = [name[ix:]
217
222
                    for name in namelist
218
223
                    if name.startswith(prefix)]
219
 
    
 
224
 
220
225
    mutter('Names in archive: %r', namelist)
221
226
    
222
227
    for name in namelist:
253
258
            continue
254
259
    
255
260
        try:
256
 
            plugin = ziobj.load_module(plugin_name)
257
 
            setattr(plugins, plugin_name, plugin)
 
261
            exec "import bzrlib.plugins.%s" % plugin_name in {}
258
262
            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))
262
 
            continue
263
263
        except KeyboardInterrupt:
264
264
            raise
265
265
        except Exception, e: