~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugin.py

  • Committer: John Arbash Meinel
  • Date: 2009-12-10 17:16:19 UTC
  • mfrom: (4884 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4889.
  • Revision ID: john@arbash-meinel.com-20091210171619-ehdcxjbl8afhq9g1
Bring in bzr.dev 4884

Show diffs side-by-side

added added

removed removed

Lines of Context:
52
52
from bzrlib import plugins as _mod_plugins
53
53
""")
54
54
 
55
 
from bzrlib.symbol_versioning import deprecated_function
 
55
from bzrlib.symbol_versioning import (
 
56
    deprecated_function,
 
57
    deprecated_in,
 
58
    )
56
59
 
57
60
 
58
61
DEFAULT_PLUGIN_PATH = None
59
62
_loaded = False
60
63
 
 
64
@deprecated_function(deprecated_in((2, 0, 0)))
61
65
def get_default_plugin_path():
62
66
    """Get the DEFAULT_PLUGIN_PATH"""
63
67
    global DEFAULT_PLUGIN_PATH
91
95
    return path
92
96
 
93
97
 
94
 
def get_standard_plugins_path():
95
 
    """Determine a plugin path suitable for general use."""
96
 
    path = os.environ.get('BZR_PLUGIN_PATH',
97
 
                          get_default_plugin_path()).split(os.pathsep)
98
 
    # Get rid of trailing slashes, since Python can't handle them when
99
 
    # it tries to import modules.
100
 
    path = map(_strip_trailing_sep, path)
 
98
def _append_new_path(paths, new_path):
 
99
    """Append a new path if it set and not already known."""
 
100
    if new_path is not None and new_path not in paths:
 
101
        paths.append(new_path)
 
102
    return paths
 
103
 
 
104
 
 
105
def get_core_plugin_path():
 
106
    core_path = None
101
107
    bzr_exe = bool(getattr(sys, 'frozen', None))
102
108
    if bzr_exe:    # expand path for bzr.exe
103
109
        # We need to use relative path to system-wide plugin
110
116
        # then plugins directory is
111
117
        # C:\Program Files\Bazaar\plugins
112
118
        # so relative path is ../../../plugins
113
 
        path.append(osutils.abspath(osutils.pathjoin(
114
 
            osutils.dirname(__file__), '../../../plugins')))
115
 
    if not bzr_exe:     # don't look inside library.zip
 
119
        core_path = osutils.abspath(osutils.pathjoin(
 
120
                osutils.dirname(__file__), '../../../plugins'))
 
121
    else:     # don't look inside library.zip
116
122
        # search the plugin path before the bzrlib installed dir
117
 
        path.append(os.path.dirname(_mod_plugins.__file__))
118
 
    # search the arch independent path if we can determine that and
119
 
    # the plugin is found nowhere else
120
 
    if sys.platform != 'win32':
121
 
        try:
122
 
            from distutils.sysconfig import get_python_lib
123
 
        except ImportError:
124
 
            # If distutuils is not available, we just won't add that path
125
 
            pass
126
 
        else:
127
 
            archless_path = osutils.pathjoin(get_python_lib(), 'bzrlib',
128
 
                    'plugins')
129
 
            if archless_path not in path:
130
 
                path.append(archless_path)
131
 
    return path
 
123
        core_path = os.path.dirname(_mod_plugins.__file__)
 
124
    return core_path
 
125
 
 
126
 
 
127
def get_site_plugin_path():
 
128
    """Returns the path for the site installed plugins."""
 
129
    if sys.platform == 'win32':
 
130
        # We don't have (yet) a good answer for windows since that is certainly
 
131
        # related to the way we build the installers. -- vila20090821
 
132
        return None
 
133
    site_path = None
 
134
    try:
 
135
        from distutils.sysconfig import get_python_lib
 
136
    except ImportError:
 
137
        # If distutuils is not available, we just don't know where they are
 
138
        pass
 
139
    else:
 
140
        site_path = osutils.pathjoin(get_python_lib(), 'bzrlib', 'plugins')
 
141
    return site_path
 
142
 
 
143
 
 
144
def get_user_plugin_path():
 
145
    return osutils.pathjoin(config.config_dir(), 'plugins')
 
146
 
 
147
 
 
148
def get_standard_plugins_path():
 
149
    """Determine a plugin path suitable for general use."""
 
150
    # Ad-Hoc default: core is not overriden by site but user can overrides both
 
151
    # The rationale is that:
 
152
    # - 'site' comes last, because these plugins should always be available and
 
153
    #   are supposed to be in sync with the bzr installed on site.
 
154
    # - 'core' comes before 'site' so that running bzr from sources or a user
 
155
    #   installed version overrides the site version.
 
156
    # - 'user' comes first, because... user is always right.
 
157
    # - the above rules clearly defines which plugin version will be loaded if
 
158
    #   several exist. Yet, it is sometimes desirable to disable some directory
 
159
    #   so that a set of plugins is disabled as once. This can be done via
 
160
    #   -site, -core, -user.
 
161
 
 
162
    env_paths = os.environ.get('BZR_PLUGIN_PATH', '+user').split(os.pathsep)
 
163
    defaults = ['+core', '+site']
 
164
 
 
165
    # The predefined references
 
166
    refs = dict(core=get_core_plugin_path(),
 
167
                site=get_site_plugin_path(),
 
168
                user=get_user_plugin_path())
 
169
 
 
170
    # Unset paths that should be removed
 
171
    for k,v in refs.iteritems():
 
172
        removed = '-%s' % k
 
173
        # defaults can never mention removing paths as that will make it
 
174
        # impossible for the user to revoke these removals.
 
175
        if removed in env_paths:
 
176
            env_paths.remove(removed)
 
177
            refs[k] = None
 
178
 
 
179
    # Expand references
 
180
    paths = []
 
181
    for p in env_paths + defaults:
 
182
        if p.startswith('+'):
 
183
            # Resolve reference if they are known
 
184
            try:
 
185
                p = refs[p[1:]]
 
186
            except KeyError:
 
187
                # Leave them untouched otherwise, user may have paths starting
 
188
                # with '+'...
 
189
                pass
 
190
        _append_new_path(paths, p)
 
191
 
 
192
    # Get rid of trailing slashes, since Python can't handle them when
 
193
    # it tries to import modules.
 
194
    paths = map(_strip_trailing_sep, paths)
 
195
    return paths
132
196
 
133
197
 
134
198
def load_plugins(path=None):