~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugin.py

  • Committer: John Arbash Meinel
  • Date: 2005-11-14 17:02:35 UTC
  • mto: (1587.1.6 bound-branches)
  • mto: This revision was merged to the branch mainline in revision 1590.
  • Revision ID: john@arbash-meinel.com-20051114170235-f85afa458bae956e
Fixing up the error message for a failed bind.

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
46
45
 
47
46
import bzrlib
48
47
from bzrlib.config import config_dir
49
 
from bzrlib.trace import log_error, mutter, warning, \
 
48
from bzrlib.trace import log_error, mutter, log_exception, warning, \
50
49
        log_exception_quietly
51
50
from bzrlib.errors import BzrError
52
51
from bzrlib import plugins
53
 
from bzrlib.osutils import pathjoin
54
 
 
55
 
DEFAULT_PLUGIN_PATH = pathjoin(config_dir(), 'plugins')
56
 
 
 
52
 
 
53
DEFAULT_PLUGIN_PATH = os.path.join(config_dir(), 'plugins')
 
54
 
 
55
all_plugins = []
57
56
_loaded = False
58
57
 
59
58
 
60
 
def all_plugins():
61
 
    """Return a dictionary of the plugins."""
62
 
    result = {}
63
 
    for name, plugin in bzrlib.plugins.__dict__.items():
64
 
        if isinstance(plugin, types.ModuleType):
65
 
            result[name] = plugin
66
 
    return result
67
 
 
68
 
 
69
 
def disable_plugins():
70
 
    """Disable loading plugins.
71
 
 
72
 
    Future calls to load_plugins() will be ignored.
73
 
    """
74
 
    # TODO: jam 20060131 This should probably also disable
75
 
    #       load_from_dirs()
76
 
    global _loaded
77
 
    _loaded = True
78
 
 
79
 
 
80
59
def load_plugins():
81
 
    """Load bzrlib 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.
82
68
 
83
69
    The environment variable BZR_PLUGIN_PATH is considered a delimited
84
70
    set of paths to look through. Each entry is searched for *.py
85
71
    files (and whatever other extensions are used in the platform,
86
72
    such as *.pyd).
 
73
    """
87
74
 
88
 
    load_from_dirs() provides the underlying mechanism and is called with
89
 
    the default directory list to provide the normal behaviour.
90
 
    """
91
 
    global _loaded
 
75
    global all_plugins, _loaded
92
76
    if _loaded:
93
77
        # People can make sure plugins are loaded, they just won't be twice
94
78
        return
95
79
        #raise BzrError("plugins already initialized")
96
80
    _loaded = True
97
81
 
98
 
    dirs = os.environ.get('BZR_PLUGIN_PATH', DEFAULT_PLUGIN_PATH).split(os.pathsep)
 
82
    dirs = os.environ.get('BZR_PLUGIN_PATH', DEFAULT_PLUGIN_PATH).split(":")
99
83
    dirs.insert(0, os.path.dirname(plugins.__file__))
100
84
 
101
 
    load_from_dirs(dirs)
102
 
 
103
 
 
104
 
def load_from_dirs(dirs):
105
 
    """Load bzrlib plugins found in each dir in dirs.
106
 
 
107
 
    Loading a plugin means importing it into the python interpreter.
108
 
    The plugin is expected to make calls to register commands when
109
 
    it's loaded (or perhaps access other hooks in future.)
110
 
 
111
 
    Plugins are loaded into bzrlib.plugins.NAME, and can be found there
112
 
    for future reference.
113
 
    """
114
85
    # The problem with imp.get_suffixes() is that it doesn't include
115
86
    # .pyo which is technically valid
116
87
    # It also means that "testmodule.so" will show up as both test and testmodule
120
91
    suffixes.append(('.pyo', 'rb', imp.PY_COMPILED))
121
92
    package_entries = ['__init__.py', '__init__.pyc', '__init__.pyo']
122
93
    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
 
96
        mutter('looking for plugins in %s' % d)
123
97
        if not d:
124
98
            continue
125
 
        mutter('looking for plugins in %s', d)
126
99
        plugin_names = set()
127
100
        if not os.path.isdir(d):
128
101
            continue
129
102
        for f in os.listdir(d):
130
 
            path = pathjoin(d, f)
 
103
            path = os.path.join(d, f)
131
104
            if os.path.isdir(path):
132
105
                for entry in package_entries:
133
106
                    # This directory should be a package, and thus added to
134
107
                    # the list
135
 
                    if os.path.isfile(pathjoin(path, entry)):
 
108
                    if os.path.isfile(os.path.join(path, entry)):
136
109
                        break
137
110
                else: # This directory is not a package
138
111
                    continue
145
118
                        break
146
119
                else:
147
120
                    continue
148
 
            if getattr(bzrlib.plugins, f, None):
149
 
                mutter('Plugin name %s already loaded', f)
150
 
            else:
151
 
                mutter('add plugin name %s', f)
152
 
                plugin_names.add(f)
 
121
            mutter('add plugin name %s' % f)
 
122
            plugin_names.add(f)
153
123
 
154
124
        plugin_names = list(plugin_names)
155
125
        plugin_names.sort()
156
126
        for name in plugin_names:
157
127
            try:
158
128
                plugin_info = imp.find_module(name, [d])
159
 
                mutter('load plugin %r', plugin_info)
 
129
                mutter('load plugin %r' % (plugin_info,))
160
130
                try:
161
131
                    plugin = imp.load_module('bzrlib.plugins.' + name,
162
132
                                             *plugin_info)
 
133
                    all_plugins.append(plugin)
163
134
                    setattr(bzrlib.plugins, name, plugin)
164
135
                finally:
165
136
                    if plugin_info[0] is not None: