~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: 2009-03-06 06:48:25 UTC
  • mfrom: (4070.8.6 debug-config)
  • Revision ID: pqm@pqm.ubuntu.com-20090306064825-kbpwggw21dygeix6
(mbp) debug_flags configuration option

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
 
18
18
"""bzr python plugin support.
41
41
import imp
42
42
import re
43
43
import types
 
44
import zipfile
44
45
 
45
46
from bzrlib import (
46
47
    _format_version_tuple,
52
53
from bzrlib import plugins as _mod_plugins
53
54
""")
54
55
 
55
 
from bzrlib.symbol_versioning import deprecated_function
 
56
from bzrlib.symbol_versioning import deprecated_function, one_three
56
57
 
57
58
 
58
59
DEFAULT_PLUGIN_PATH = None
253
254
                trace.print_exception(sys.exc_info(), sys.stderr)
254
255
 
255
256
 
 
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
 
256
338
def plugins():
257
339
    """Return a dictionary of the plugins.
258
340
 
303
385
        """
304
386
        self.module = module
305
387
 
306
 
    def get_help_text(self, additional_see_also=None, verbose=True):
 
388
    def get_help_text(self, additional_see_also=None):
307
389
        """Return a string with the help for this topic.
308
390
 
309
391
        :param additional_see_also: Additional help topics to be