~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/hooks.py

  • Committer: Vincent Ladeuil
  • Date: 2010-06-29 16:21:13 UTC
  • mfrom: (5325 +trunk)
  • mto: (5247.1.12 first-try)
  • mto: This revision was merged to the branch mainline in revision 5326.
  • Revision ID: v.ladeuil+lp@free.fr-20100629162113-xa6y33u17mfi024v
Merge bzr.dev into cleanup resolving conflicts

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