~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/hooks.py

  • Committer: Patch Queue Manager
  • Date: 2013-07-14 10:59:28 UTC
  • mfrom: (6579.2.1 1195783-platform-utf8)
  • Revision ID: pqm@pqm.ubuntu.com-20130714105928-78j748r1djstxmo1
(vila) Make 'bzr version' support utf8 platform names. (Vincent Ladeuil)

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
 
 
18
17
"""Support for plugin hooking logic."""
19
18
 
 
19
from __future__ import absolute_import
 
20
 
20
21
from bzrlib import (
21
22
    registry,
22
23
    symbol_versioning,
30
31
    errors,
31
32
    pyutils,
32
33
    )
 
34
from bzrlib.i18n import gettext
33
35
""")
34
36
 
35
37
 
70
72
 
71
73
_builtin_known_hooks = (
72
74
    ('bzrlib.branch', 'Branch.hooks', 'BranchHooks'),
73
 
    ('bzrlib.bzrdir', 'BzrDir.hooks', 'BzrDirHooks'),
 
75
    ('bzrlib.controldir', 'ControlDir.hooks', 'ControlDirHooks'),
74
76
    ('bzrlib.commands', 'Command.hooks', 'CommandHooks'),
 
77
    ('bzrlib.config', 'ConfigHooks', '_ConfigHooks'),
75
78
    ('bzrlib.info', 'hooks', 'InfoHooks'),
76
79
    ('bzrlib.lock', 'Lock.hooks', 'LockHooks'),
77
80
    ('bzrlib.merge', 'Merger.hooks', 'MergeHooks'),
80
83
    ('bzrlib.smart.client', '_SmartClient.hooks', 'SmartClientHooks'),
81
84
    ('bzrlib.smart.server', 'SmartTCPServer.hooks', 'SmartServerHooks'),
82
85
    ('bzrlib.status', 'hooks', 'StatusHooks'),
 
86
    ('bzrlib.transport', 'Transport.hooks', 'TransportHooks'),
83
87
    ('bzrlib.version_info_formats.format_rio', 'RioVersionInfoBuilder.hooks',
84
88
        'RioVersionInfoBuilderHooks'),
85
89
    ('bzrlib.merge_directive', 'BaseMergeDirective.hooks',
102
106
    return pyutils.get_named_object(module_name, member_name)
103
107
 
104
108
 
105
 
@symbol_versioning.deprecated_function(symbol_versioning.deprecated_in((2, 3)))
106
 
def known_hooks_key_to_parent_and_attribute(key):
107
 
    """See KnownHooksRegistry.key_to_parent_and_attribute."""
108
 
    return known_hooks.key_to_parent_and_attribute(key)
109
 
 
110
 
 
111
109
class Hooks(dict):
112
110
    """A dictionary mapping hook name to a list of callables.
113
111
 
125
123
        """
126
124
        dict.__init__(self)
127
125
        self._callable_names = {}
 
126
        self._lazy_callable_names = {}
128
127
        self._module = module
129
128
        self._member_name = member_name
130
129
 
148
147
                              deprecated=deprecated, callbacks=callbacks)
149
148
        self[name] = hookpoint
150
149
 
151
 
    @symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 4)))
152
 
    def create_hook(self, hook):
153
 
        """Create a hook which can have callbacks registered for it.
154
 
 
155
 
        :param hook: The hook to create. An object meeting the protocol of
156
 
            bzrlib.hooks.HookPoint. It's name is used as the key for future
157
 
            lookups.
158
 
        """
159
 
        if hook.name in self:
160
 
            raise errors.DuplicateKey(hook.name)
161
 
        self[hook.name] = hook
162
 
 
163
150
    def docs(self):
164
151
        """Generate the documentation for this Hooks instance.
165
152
 
194
181
        the code names are rarely meaningful for end users and this is not
195
182
        intended for debugging.
196
183
        """
197
 
        return self._callable_names.get(a_callable, "No hook name")
 
184
        name = self._callable_names.get(a_callable, None)
 
185
        if name is None and a_callable is not None:
 
186
            name = self._lazy_callable_names.get((a_callable.__module__,
 
187
                                                  a_callable.__name__),
 
188
                                                 None)
 
189
        if name is None:
 
190
            return 'No hook name'
 
191
        return name
 
192
 
198
193
 
199
194
    def install_named_hook_lazy(self, hook_name, callable_module,
200
195
        callable_member, name):
219
214
                self)
220
215
        else:
221
216
            hook_lazy(callable_module, callable_member, name)
 
217
        if name is not None:
 
218
            self.name_hook_lazy(callable_module, callable_member, name)
222
219
 
223
220
    def install_named_hook(self, hook_name, a_callable, name):
224
221
        """Install a_callable in to the hook hook_name, and label it name.
256
253
        try:
257
254
            uninstall = getattr(hook, "uninstall")
258
255
        except AttributeError:
259
 
            raise errors.UnsupportedOperation(self.install_named_hook_lazy,
260
 
                self)
 
256
            raise errors.UnsupportedOperation(self.uninstall_named_hook, self)
261
257
        else:
262
258
            uninstall(label)
263
259
 
265
261
        """Associate name with a_callable to show users what is running."""
266
262
        self._callable_names[a_callable] = name
267
263
 
 
264
    def name_hook_lazy(self, callable_module, callable_member, callable_name):
 
265
        self._lazy_callable_names[(callable_module, callable_member)]= \
 
266
            callable_name
 
267
 
268
268
 
269
269
class HookPoint(object):
270
270
    """A single hook that clients can register to be called back when it fires.
310
310
            introduced_string = _format_version_tuple(self.introduced)
311
311
        else:
312
312
            introduced_string = 'unknown'
313
 
        strings.append('Introduced in: %s' % introduced_string)
 
313
        strings.append(gettext('Introduced in: %s') % introduced_string)
314
314
        if self.deprecated:
315
315
            deprecated_string = _format_version_tuple(self.deprecated)
316
 
            strings.append('Deprecated in: %s' % deprecated_string)
 
316
            strings.append(gettext('Deprecated in: %s') % deprecated_string)
317
317
        strings.append('')
318
318
        strings.extend(textwrap.wrap(self.__doc__,
319
319
            break_long_words=False))