~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugin.py

  • Committer: Robert Collins
  • Date: 2005-10-30 00:00:09 UTC
  • mfrom: (1185.16.134)
  • Revision ID: robertc@robertcollins.net-20051030000009-9db99a338a0dfdac
MergeĀ fromĀ Martin.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
 
18
 
# This module implements plug-in support.
19
 
# Any python module in $BZR_PLUGIN_PATH will be imported upon initialization
20
 
# of bzrlib (and then forgotten about).  In the plugin's main body, it should
21
 
# update any bzrlib registries it wants to extend; for example, to add new
22
 
# commands, import bzrlib.commands and add your new command to the
23
 
# plugin_cmds variable.
24
 
 
25
 
 
 
18
"""bzr python plugin support
 
19
 
 
20
Any python module in $BZR_PLUGIN_PATH will be imported upon initialization of
 
21
bzrlib. The module will be imported as 'bzrlib.plugins.$BASENAME(PLUGIN)'.
 
22
In the plugin's main body, it should update any bzrlib registries it wants to
 
23
extend; for example, to add new commands, import bzrlib.commands and add your
 
24
new command to the plugin_cmds variable.
 
25
"""
 
26
 
 
27
# TODO: Refactor this to make it more testable.  The main problem at the
 
28
# moment is that loading plugins affects the global process state -- for bzr
 
29
# in general use it's a reasonable assumption that all plugins are loaded at
 
30
# startup and then stay loaded, but this is less good for testing.
 
31
 
32
# Several specific issues:
 
33
#  - plugins can't be unloaded and will continue to effect later tests
 
34
#  - load_plugins does nothing if called a second time
 
35
#  - plugin hooks can't be removed
 
36
#
 
37
# Our options are either to remove these restrictions, or work around them by
 
38
# loading the plugins into a different space than the one running the tests.
 
39
# That could be either a separate Python interpreter or perhaps a new
 
40
# namespace inside this interpreter.
 
41
 
 
42
import imp
26
43
import os
27
 
from bzrlib.osutils import config_dir
 
44
import sys
 
45
 
 
46
import bzrlib
 
47
from bzrlib.config import config_dir
 
48
from bzrlib.trace import log_error, mutter, log_exception, warning, \
 
49
        log_exception_quietly
 
50
from bzrlib.errors import BzrError
 
51
from bzrlib import plugins
 
52
 
28
53
DEFAULT_PLUGIN_PATH = os.path.join(config_dir(), 'plugins')
29
54
 
30
55
all_plugins = []
32
57
 
33
58
 
34
59
def load_plugins():
35
 
    """
36
 
    Find all python plugins and load them.
 
60
    """Find all python plugins and load them.
37
61
 
38
62
    Loading a plugin means importing it into the python interpreter.
39
63
    The plugin is expected to make calls to register commands when
55
79
        #raise BzrError("plugins already initialized")
56
80
    _loaded = True
57
81
 
58
 
    import sys, os, imp
59
 
    try:
60
 
        set
61
 
    except NameError:
62
 
        from sets import Set as set         # python2.3
63
 
 
64
 
    from bzrlib.trace import log_error, mutter, log_exception
65
 
    from bzrlib.errors import BzrError
66
 
 
67
 
    bzrpath = os.environ.get('BZR_PLUGIN_PATH', DEFAULT_PLUGIN_PATH)
 
82
    dirs = os.environ.get('BZR_PLUGIN_PATH', DEFAULT_PLUGIN_PATH).split(":")
 
83
    dirs.insert(0, os.path.dirname(plugins.__file__))
68
84
 
69
85
    # The problem with imp.get_suffixes() is that it doesn't include
70
86
    # .pyo which is technically valid
74
90
    suffixes = imp.get_suffixes()
75
91
    suffixes.append(('.pyo', 'rb', imp.PY_COMPILED))
76
92
    package_entries = ['__init__.py', '__init__.pyc', '__init__.pyo']
77
 
    for d in bzrpath.split(os.pathsep):
 
93
    for d in dirs:
78
94
        # going through them one by one allows different plugins with the same
79
95
        # filename in different directories in the path
80
96
        mutter('looking for plugins in %s' % d)
112
128
                plugin_info = imp.find_module(name, [d])
113
129
                mutter('load plugin %r' % (plugin_info,))
114
130
                try:
115
 
                    plugin = imp.load_module('bzrlib.plugin.' + name,
 
131
                    plugin = imp.load_module('bzrlib.plugins.' + name,
116
132
                                             *plugin_info)
117
 
                    all_plugins.append(plugin_info)
 
133
                    all_plugins.append(plugin)
 
134
                    setattr(bzrlib.plugins, name, plugin)
118
135
                finally:
119
136
                    if plugin_info[0] is not None:
120
137
                        plugin_info[0].close()
121
 
            except Exception, e:
122
 
                log_error('Unable to load plugin %r from %r' % (name, d))
123
 
                log_error(str(e))
124
 
                log_exception()
125
138
 
 
139
                mutter('loaded succesfully')
 
140
            except:
 
141
                ## import pdb
 
142
                ## pdb.set_trace()
 
143
                warning('Unable to load plugin %r from %r' % (name, d))
 
144
                log_exception_quietly()