/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/hooks.py

  • Committer: Robert Collins
  • Date: 2010-05-06 11:08:10 UTC
  • mto: This revision was merged to the branch mainline in revision 5223.
  • Revision ID: robertc@robertcollins.net-20100506110810-h3j07fh5gmw54s25
Cleaner matcher matching revised unlocking protocol.

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
 
18
18
"""Support for plugin hooking logic."""
19
 
from bzrlib import (
20
 
    pyutils,
21
 
    registry,
22
 
    symbol_versioning,
23
 
    )
 
19
from bzrlib import registry
24
20
from bzrlib.lazy_import import lazy_import
25
21
lazy_import(globals(), """
26
22
import textwrap
33
29
""")
34
30
 
35
31
 
36
 
class KnownHooksRegistry(registry.Registry):
37
 
    # known_hooks registry contains
38
 
    # tuple of (module, member name) which is the hook point
39
 
    # module where the specific hooks are defined
40
 
    # callable to get the empty specific Hooks for that attribute
41
 
 
42
 
    def register_lazy_hook(self, hook_module_name, hook_member_name,
43
 
            hook_factory_member_name):
44
 
        self.register_lazy((hook_module_name, hook_member_name),
45
 
            hook_module_name, hook_factory_member_name)
46
 
 
47
 
    def iter_parent_objects(self):
48
 
        """Yield (hook_key, (parent_object, attr)) tuples for every registered
49
 
        hook, where 'parent_object' is the object that holds the hook
50
 
        instance.
51
 
 
52
 
        This is useful for resetting/restoring all the hooks to a known state,
53
 
        as is done in bzrlib.tests.TestCase._clear_hooks.
54
 
        """
55
 
        for key in self.keys():
56
 
            yield key, self.key_to_parent_and_attribute(key)
57
 
 
58
 
    def key_to_parent_and_attribute(self, (module_name, member_name)):
59
 
        """Convert a known_hooks key to a (parent_obj, attr) pair.
60
 
 
61
 
        :param key: A tuple (module_name, member_name) as found in the keys of
62
 
            the known_hooks registry.
63
 
        :return: The parent_object of the hook and the name of the attribute on
64
 
            that parent object where the hook is kept.
65
 
        """
66
 
        parent_mod, parent_member, attr = pyutils.calc_parent_name(module_name,
67
 
            member_name)
68
 
        return pyutils.get_named_object(parent_mod, parent_member), attr
69
 
 
70
 
 
71
 
_builtin_known_hooks = (
72
 
    ('bzrlib.branch', 'Branch.hooks', 'BranchHooks'),
73
 
    ('bzrlib.bzrdir', 'BzrDir.hooks', 'BzrDirHooks'),
74
 
    ('bzrlib.commands', 'Command.hooks', 'CommandHooks'),
75
 
    ('bzrlib.info', 'hooks', 'InfoHooks'),
76
 
    ('bzrlib.lock', 'Lock.hooks', 'LockHooks'),
77
 
    ('bzrlib.merge', 'Merger.hooks', 'MergeHooks'),
78
 
    ('bzrlib.msgeditor', 'hooks', 'MessageEditorHooks'),
79
 
    ('bzrlib.mutabletree', 'MutableTree.hooks', 'MutableTreeHooks'),
80
 
    ('bzrlib.smart.client', '_SmartClient.hooks', 'SmartClientHooks'),
81
 
    ('bzrlib.smart.server', 'SmartTCPServer.hooks', 'SmartServerHooks'),
82
 
    ('bzrlib.status', 'hooks', 'StatusHooks'),
83
 
    ('bzrlib.version_info_formats.format_rio', 'RioVersionInfoBuilder.hooks',
84
 
        'RioVersionInfoBuilderHooks'),
85
 
    ('bzrlib.merge_directive', 'BaseMergeDirective.hooks',
86
 
        'MergeDirectiveHooks'),
87
 
    )
88
 
 
89
 
known_hooks = KnownHooksRegistry()
90
 
for (_hook_module, _hook_attribute, _hook_class) in _builtin_known_hooks:
91
 
    known_hooks.register_lazy_hook(_hook_module, _hook_attribute, _hook_class)
92
 
del _builtin_known_hooks, _hook_module, _hook_attribute, _hook_class
 
32
known_hooks = registry.Registry()
 
33
# known_hooks registry contains
 
34
# tuple of (module, member name) which is the hook point
 
35
# module where the specific hooks are defined
 
36
# callable to get the empty specific Hooks for that attribute
 
37
known_hooks.register_lazy(('bzrlib.branch', 'Branch.hooks'), 'bzrlib.branch',
 
38
    'BranchHooks')
 
39
known_hooks.register_lazy(('bzrlib.bzrdir', 'BzrDir.hooks'), 'bzrlib.bzrdir',
 
40
    'BzrDirHooks')
 
41
known_hooks.register_lazy(('bzrlib.commands', 'Command.hooks'),
 
42
    'bzrlib.commands', 'CommandHooks')
 
43
known_hooks.register_lazy(('bzrlib.info', 'hooks'),
 
44
    'bzrlib.info', 'InfoHooks')
 
45
known_hooks.register_lazy(('bzrlib.lock', 'Lock.hooks'), 'bzrlib.lock',
 
46
    'LockHooks')
 
47
known_hooks.register_lazy(('bzrlib.merge', 'Merger.hooks'), 'bzrlib.merge',
 
48
    'MergeHooks')
 
49
known_hooks.register_lazy(('bzrlib.msgeditor', 'hooks'), 'bzrlib.msgeditor',
 
50
    'MessageEditorHooks')
 
51
known_hooks.register_lazy(('bzrlib.mutabletree', 'MutableTree.hooks'),
 
52
    'bzrlib.mutabletree', 'MutableTreeHooks')
 
53
known_hooks.register_lazy(('bzrlib.smart.client', '_SmartClient.hooks'),
 
54
    'bzrlib.smart.client', 'SmartClientHooks')
 
55
known_hooks.register_lazy(('bzrlib.smart.server', 'SmartTCPServer.hooks'),
 
56
    'bzrlib.smart.server', 'SmartServerHooks')
 
57
known_hooks.register_lazy(
 
58
    ('bzrlib.version_info_formats.format_rio', 'RioVersionInfoBuilder.hooks'),
 
59
    'bzrlib.version_info_formats.format_rio', 'RioVersionInfoBuilderHooks')
 
60
known_hooks.register_lazy(
 
61
    ('bzrlib.merge_directive', 'BaseMergeDirective.hooks'),
 
62
    'bzrlib.merge_directive', 'MergeDirectiveHooks')
93
63
 
94
64
 
95
65
def known_hooks_key_to_object((module_name, member_name)):
99
69
        the known_hooks registry.
100
70
    :return: The object this specifies.
101
71
    """
102
 
    return pyutils.get_named_object(module_name, member_name)
103
 
 
104
 
 
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)
 
72
    return registry._LazyObjectGetter(module_name, member_name).get_obj()
 
73
 
 
74
 
 
75
def known_hooks_key_to_parent_and_attribute((module_name, member_name)):
 
76
    """Convert a known_hooks key to a object.
 
77
 
 
78
    :param key: A tuple (module_name, member_name) as found in the keys of
 
79
        the known_hooks registry.
 
80
    :return: The object this specifies.
 
81
    """
 
82
    member_list = member_name.rsplit('.', 1)
 
83
    if len(member_list) == 2:
 
84
        parent_name, attribute = member_list
 
85
    else:
 
86
        parent_name = None
 
87
        attribute = member_name
 
88
    parent = known_hooks_key_to_object((module_name, parent_name))
 
89
    return parent, attribute
109
90
 
110
91
 
111
92
class Hooks(dict):
198
179
    """A single hook that clients can register to be called back when it fires.
199
180
 
200
181
    :ivar name: The name of the hook.
201
 
    :ivar doc: The docs for using the hook.
202
182
    :ivar introduced: A version tuple specifying what version the hook was
203
183
        introduced in. None indicates an unknown version.
204
184
    :ivar deprecated: A version tuple specifying what version the hook was
205
185
        deprecated or superseded in. None indicates that the hook is not
206
186
        superseded or deprecated. If the hook is superseded then the doc
207
187
        should describe the recommended replacement hook to register for.
 
188
    :ivar doc: The docs for using the hook.
208
189
    """
209
190
 
210
191
    def __init__(self, name, doc, introduced, deprecated):
295
276
 
296
277
  yyy.hooks.install_named_hook("xxx", ...)
297
278
 
298
 
See :doc:`Using hooks<../user-guide/hooks>` in the User Guide for examples.
 
279
See `Using hooks`_ in the User Guide for examples.
 
280
 
 
281
.. _Using hooks: ../user-guide/hooks.html
299
282
 
300
283
The class that contains each hook is given before the hooks it supplies. For
301
284
instance, BranchHooks as the class is the hooks class for