~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugin.py

Rework test_script a little bit.


Don't allow someone to request a stdin request to echo.
Echo never reads from stdin, it just echos its arguments.
You use 'cat' if you want to read from stdin.

A few other fixes because the tests were using filenames
that are actually illegal on Windows, rather than just
nonexistant.


Change the exception handling for commands so that
unknown errors don't get silently squashed and then
turn into hard-to-debug errors later.

test_script now passes on Windows.

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):