~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugin.py

  • Committer: Robert Collins
  • Date: 2005-11-29 22:43:27 UTC
  • Revision ID: robertc@robertcollins.net-20051129224327-ea254360b6b77a3a
    * Plugins with the same name in different directories in the bzr plugin
      path are no longer loaded: only the first successfully loaded one is
      used. (Robert Collins)

    * bzrlib.plugin.all_plugins has been removed, instead look in
      bzrlib.plugins. (Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
52
52
 
53
53
DEFAULT_PLUGIN_PATH = os.path.join(config_dir(), 'plugins')
54
54
 
55
 
all_plugins = []
56
55
_loaded = False
57
56
 
58
57
 
59
58
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.
 
59
    """Load bzrlib plugins.
68
60
 
69
61
    The environment variable BZR_PLUGIN_PATH is considered a delimited
70
62
    set of paths to look through. Each entry is searched for *.py
71
63
    files (and whatever other extensions are used in the platform,
72
64
    such as *.pyd).
 
65
 
 
66
    load_from_dirs() provides the underlying mechanism and is called with
 
67
    the default directory list to provide the normal behaviour.
73
68
    """
74
 
 
75
 
    global all_plugins, _loaded
 
69
    global _loaded
76
70
    if _loaded:
77
71
        # People can make sure plugins are loaded, they just won't be twice
78
72
        return
82
76
    dirs = os.environ.get('BZR_PLUGIN_PATH', DEFAULT_PLUGIN_PATH).split(os.pathsep)
83
77
    dirs.insert(0, os.path.dirname(plugins.__file__))
84
78
 
 
79
    load_from_dirs(dirs)
 
80
 
 
81
def load_from_dirs(dirs):
 
82
    """Load bzrlib plugins found in each dir in dirs.
 
83
 
 
84
    Loading a plugin means importing it into the python interpreter.
 
85
    The plugin is expected to make calls to register commands when
 
86
    it's loaded (or perhaps access other hooks in future.)
 
87
 
 
88
    Plugins are loaded into bzrlib.plugins.NAME, and can be found there
 
89
    for future reference.
 
90
    """
85
91
    # The problem with imp.get_suffixes() is that it doesn't include
86
92
    # .pyo which is technically valid
87
93
    # It also means that "testmodule.so" will show up as both test and testmodule
91
97
    suffixes.append(('.pyo', 'rb', imp.PY_COMPILED))
92
98
    package_entries = ['__init__.py', '__init__.pyc', '__init__.pyo']
93
99
    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
 
100
        if not d:
 
101
            continue
96
102
        mutter('looking for plugins in %s', d)
97
 
        if not d:
98
 
            continue
99
103
        plugin_names = set()
100
104
        if not os.path.isdir(d):
101
105
            continue
118
122
                        break
119
123
                else:
120
124
                    continue
121
 
            mutter('add plugin name %s', f)
122
 
            plugin_names.add(f)
 
125
            if getattr(bzrlib.plugins, f, None):
 
126
                mutter('Plugin name %s already loaded', f)
 
127
            else:
 
128
                mutter('add plugin name %s', f)
 
129
                plugin_names.add(f)
123
130
 
124
131
        plugin_names = list(plugin_names)
125
132
        plugin_names.sort()
130
137
                try:
131
138
                    plugin = imp.load_module('bzrlib.plugins.' + name,
132
139
                                             *plugin_info)
133
 
                    all_plugins.append(plugin)
134
140
                    setattr(bzrlib.plugins, name, plugin)
135
141
                finally:
136
142
                    if plugin_info[0] is not None: