~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugin.py

[merge] bzr.dev 1491

Show diffs side-by-side

added added

removed removed

Lines of Context:
42
42
import imp
43
43
import os
44
44
import sys
 
45
import types
45
46
 
46
47
import bzrlib
47
48
from bzrlib.config import config_dir
52
53
 
53
54
DEFAULT_PLUGIN_PATH = os.path.join(config_dir(), 'plugins')
54
55
 
55
 
all_plugins = []
56
56
_loaded = False
57
57
 
58
58
 
 
59
def all_plugins():
 
60
    """Return a dictionary of the plugins."""
 
61
    result = {}
 
62
    for name, plugin in bzrlib.plugins.__dict__.items():
 
63
        if isinstance(plugin, types.ModuleType):
 
64
            result[name] = plugin
 
65
    return result
 
66
 
 
67
 
59
68
def load_plugins():
60
 
    """Find all python plugins and load them.
61
 
 
62
 
    Loading a plugin means importing it into the python interpreter.
63
 
    The plugin is expected to make calls to register commands when
64
 
    it's loaded (or perhaps access other hooks in future.)
65
 
 
66
 
    A list of plugs is stored in bzrlib.plugin.all_plugins for future
67
 
    reference.
 
69
    """Load bzrlib plugins.
68
70
 
69
71
    The environment variable BZR_PLUGIN_PATH is considered a delimited
70
72
    set of paths to look through. Each entry is searched for *.py
71
73
    files (and whatever other extensions are used in the platform,
72
74
    such as *.pyd).
 
75
 
 
76
    load_from_dirs() provides the underlying mechanism and is called with
 
77
    the default directory list to provide the normal behaviour.
73
78
    """
74
 
 
75
 
    global all_plugins, _loaded
 
79
    global _loaded
76
80
    if _loaded:
77
81
        # People can make sure plugins are loaded, they just won't be twice
78
82
        return
82
86
    dirs = os.environ.get('BZR_PLUGIN_PATH', DEFAULT_PLUGIN_PATH).split(os.pathsep)
83
87
    dirs.insert(0, os.path.dirname(plugins.__file__))
84
88
 
 
89
    load_from_dirs(dirs)
 
90
 
 
91
 
 
92
def load_from_dirs(dirs):
 
93
    """Load bzrlib plugins found in each dir in dirs.
 
94
 
 
95
    Loading a plugin means importing it into the python interpreter.
 
96
    The plugin is expected to make calls to register commands when
 
97
    it's loaded (or perhaps access other hooks in future.)
 
98
 
 
99
    Plugins are loaded into bzrlib.plugins.NAME, and can be found there
 
100
    for future reference.
 
101
    """
85
102
    # The problem with imp.get_suffixes() is that it doesn't include
86
103
    # .pyo which is technically valid
87
104
    # It also means that "testmodule.so" will show up as both test and testmodule
91
108
    suffixes.append(('.pyo', 'rb', imp.PY_COMPILED))
92
109
    package_entries = ['__init__.py', '__init__.pyc', '__init__.pyo']
93
110
    for d in dirs:
94
 
        # going through them one by one allows different plugins with the same
95
 
        # filename in different directories in the path
 
111
        if not d:
 
112
            continue
96
113
        mutter('looking for plugins in %s', d)
97
 
        if not d:
98
 
            continue
99
114
        plugin_names = set()
100
115
        if not os.path.isdir(d):
101
116
            continue
118
133
                        break
119
134
                else:
120
135
                    continue
121
 
            mutter('add plugin name %s', f)
122
 
            plugin_names.add(f)
 
136
            if getattr(bzrlib.plugins, f, None):
 
137
                mutter('Plugin name %s already loaded', f)
 
138
            else:
 
139
                mutter('add plugin name %s', f)
 
140
                plugin_names.add(f)
123
141
 
124
142
        plugin_names = list(plugin_names)
125
143
        plugin_names.sort()
130
148
                try:
131
149
                    plugin = imp.load_module('bzrlib.plugins.' + name,
132
150
                                             *plugin_info)
133
 
                    all_plugins.append(plugin)
134
151
                    setattr(bzrlib.plugins, name, plugin)
135
152
                finally:
136
153
                    if plugin_info[0] is not None: