~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugin.py

  • Committer: Andrew Bennetts
  • Date: 2009-07-27 05:35:00 UTC
  • mfrom: (4570 +trunk)
  • mto: (4634.6.29 2.0)
  • mto: This revision was merged to the branch mainline in revision 4680.
  • Revision ID: andrew.bennetts@canonical.com-20090727053500-q76zsn2dx33jhmj5
Merge bzr.dev.

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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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
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
 
385
303
        """
386
304
        self.module = module
387
305
 
388
 
    def get_help_text(self, additional_see_also=None):
 
306
    def get_help_text(self, additional_see_also=None, verbose=True):
389
307
        """Return a string with the help for this topic.
390
308
 
391
309
        :param additional_see_also: Additional help topics to be