~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugin.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2007-06-28 07:08:27 UTC
  • mfrom: (2553.1.3 integration)
  • Revision ID: pqm@pqm.ubuntu.com-20070628070827-h5s313dg5tnag9vj
(robertc) Show the names of commit hooks during commit.

Show diffs side-by-side

added added

removed removed

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