~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugin.py

  • Committer: Martin Pool
  • Date: 2005-09-07 23:14:30 UTC
  • mto: (1092.2.12) (974.1.76) (1185.8.2)
  • mto: This revision was merged to the branch mainline in revision 1390.
  • Revision ID: mbp@sourcefrog.net-20050907231430-097abbaee94ad75b
- docstring fix from Magnus Therning

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
 
"""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
 
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
 
43
26
import os
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
 
 
 
27
from bzrlib.osutils import config_dir
53
28
DEFAULT_PLUGIN_PATH = os.path.join(config_dir(), 'plugins')
54
29
 
55
30
all_plugins = []
57
32
 
58
33
 
59
34
def load_plugins():
60
 
    """Find all python plugins and load them.
 
35
    """
 
36
    Find all python plugins and load them.
61
37
 
62
38
    Loading a plugin means importing it into the python interpreter.
63
39
    The plugin is expected to make calls to register commands when
79
55
        #raise BzrError("plugins already initialized")
80
56
    _loaded = True
81
57
 
82
 
    dirs = os.environ.get('BZR_PLUGIN_PATH', DEFAULT_PLUGIN_PATH).split(os.pathsep)
 
58
    import sys, os, imp
 
59
    
 
60
    from bzrlib.trace import log_error, mutter, log_exception
 
61
    from bzrlib.errors import BzrError
 
62
    from bzrlib import plugins
 
63
 
 
64
    dirs = os.environ.get('BZR_PLUGIN_PATH', DEFAULT_PLUGIN_PATH).split(":")
83
65
    dirs.insert(0, os.path.dirname(plugins.__file__))
84
66
 
85
67
    # The problem with imp.get_suffixes() is that it doesn't include
93
75
    for d in dirs:
94
76
        # going through them one by one allows different plugins with the same
95
77
        # filename in different directories in the path
96
 
        mutter('looking for plugins in %s', d)
 
78
        mutter('looking for plugins in %s' % d)
97
79
        if not d:
98
80
            continue
99
81
        plugin_names = set()
118
100
                        break
119
101
                else:
120
102
                    continue
121
 
            mutter('add plugin name %s', f)
 
103
            mutter('add plugin name %s' % f)
122
104
            plugin_names.add(f)
123
105
 
124
106
        plugin_names = list(plugin_names)
126
108
        for name in plugin_names:
127
109
            try:
128
110
                plugin_info = imp.find_module(name, [d])
129
 
                mutter('load plugin %r', plugin_info)
 
111
                mutter('load plugin %r' % (plugin_info,))
130
112
                try:
131
 
                    plugin = imp.load_module('bzrlib.plugins.' + name,
 
113
                    plugin = imp.load_module('bzrlib.plugin.' + name,
132
114
                                             *plugin_info)
133
115
                    all_plugins.append(plugin)
134
 
                    setattr(bzrlib.plugins, name, plugin)
135
116
                finally:
136
117
                    if plugin_info[0] is not None:
137
118
                        plugin_info[0].close()
138
119
 
139
120
                mutter('loaded succesfully')
140
 
            except KeyboardInterrupt:
141
 
                raise
142
 
            except Exception, e:
143
 
                ## import pdb; pdb.set_trace()
144
 
                warning('Unable to load plugin %r from %r' % (name, d))
145
 
                log_exception_quietly()
 
121
            except:
 
122
                log_error('Unable to load plugin %r from %r' % (name, d))
 
123
                log_exception()
 
124