Rev 5751: (jelmer) Add Hooks.uninstall_named_hook(). (Jelmer Vernooij) in file:///home/pqm/archives/thelove/bzr/%2Btrunk/
Canonical.com Patch Queue Manager
pqm at pqm.ubuntu.com
Sat Apr 2 00:59:55 UTC 2011
At file:///home/pqm/archives/thelove/bzr/%2Btrunk/
------------------------------------------------------------
revno: 5751 [merge]
revision-id: pqm at pqm.ubuntu.com-20110402005952-kxcwbwdk6jagtfwm
parent: pqm at pqm.ubuntu.com-20110401152020-s70c2mcflogs5zar
parent: jelmer at samba.org-20110402000839-qvxpq267q9tqdjrg
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Sat 2011-04-02 00:59:52 +0000
message:
(jelmer) Add Hooks.uninstall_named_hook(). (Jelmer Vernooij)
modified:
bzrlib/hooks.py hooks.py-20070325015548-ix4np2q0kd8452au-1
bzrlib/tests/test_hooks.py test_hooks.py-20070628030849-89rtsbe5dmer5npz-1
doc/en/release-notes/bzr-2.4.txt bzr2.4.txt-20110114053217-k7ym9jfz243fddjm-1
=== modified file 'bzrlib/hooks.py'
--- a/bzrlib/hooks.py 2011-03-30 13:03:08 +0000
+++ b/bzrlib/hooks.py 2011-04-02 00:08:39 +0000
@@ -243,6 +243,24 @@
if name is not None:
self.name_hook(a_callable, name)
+ def uninstall_named_hook(self, hook_name, label):
+ """Uninstall named hooks.
+
+ :param hook_name: Hook point name
+ :param label: Label of the callable to uninstall
+ """
+ try:
+ hook = self[hook_name]
+ except KeyError:
+ raise errors.UnknownHook(self.__class__.__name__, hook_name)
+ try:
+ uninstall = getattr(hook, "uninstall")
+ except AttributeError:
+ raise errors.UnsupportedOperation(self.install_named_hook_lazy,
+ self)
+ else:
+ uninstall(label)
+
def name_hook(self, a_callable, name):
"""Associate name with a_callable to show users what is running."""
self._callable_names[a_callable] = name
@@ -328,6 +346,21 @@
obj_getter = registry._ObjectGetter(callback)
self._callbacks.append((obj_getter, callback_label))
+ def uninstall(self, label):
+ """Uninstall the callback with the specified label.
+
+ :param label: Label of the entry to uninstall
+ """
+ entries_to_remove = []
+ for entry in self._callbacks:
+ (entry_callback, entry_label) = entry
+ if entry_label == label:
+ entries_to_remove.append(entry)
+ if entries_to_remove == []:
+ raise KeyError("No entry with label %r" % label)
+ for entry in entries_to_remove:
+ self._callbacks.remove(entry)
+
def __iter__(self):
return (callback.get_obj() for callback, name in self._callbacks)
=== modified file 'bzrlib/tests/test_hooks.py'
--- a/bzrlib/tests/test_hooks.py 2011-03-30 13:03:08 +0000
+++ b/bzrlib/tests/test_hooks.py 2011-04-02 00:08:39 +0000
@@ -114,6 +114,43 @@
hooks.install_named_hook('set_rh', None, "demo")
self.assertEqual("demo", hooks.get_hook_name(None))
+ def test_uninstall_named_hook(self):
+ hooks = Hooks("bzrlib.tests.test_hooks", "some_hooks")
+ hooks.add_hook('set_rh', "Set revision history", (2, 0))
+ hooks.install_named_hook('set_rh', None, "demo")
+ self.assertEqual(1, len(hooks["set_rh"]))
+ hooks.uninstall_named_hook("set_rh", "demo")
+ self.assertEqual(0, len(hooks["set_rh"]))
+
+ def test_uninstall_multiple_named_hooks(self):
+ # Multiple callbacks with the same label all get removed
+ hooks = Hooks("bzrlib.tests.test_hooks", "some_hooks")
+ hooks.add_hook('set_rh', "Set revision history", (2, 0))
+ hooks.install_named_hook('set_rh', 1, "demo")
+ hooks.install_named_hook('set_rh', 2, "demo")
+ hooks.install_named_hook('set_rh', 3, "othername")
+ self.assertEqual(3, len(hooks["set_rh"]))
+ hooks.uninstall_named_hook("set_rh", "demo")
+ self.assertEqual(1, len(hooks["set_rh"]))
+
+ def test_uninstall_named_hook_unknown_callable(self):
+ hooks = Hooks("bzrlib.tests.test_hooks", "some_hooks")
+ hooks.add_hook('set_rh', "Set revision hsitory", (2, 0))
+ self.assertRaises(KeyError, hooks.uninstall_named_hook, "set_rh",
+ "demo")
+
+ def test_uninstall_named_hook_raises_unknown_hook(self):
+ hooks = Hooks("bzrlib.tests.test_hooks", "some_hooks")
+ self.assertRaises(errors.UnknownHook, hooks.uninstall_named_hook,
+ 'silly', "")
+
+ def test_uninstall_named_hook_old_style(self):
+ hooks = Hooks("bzrlib.tests.test_hooks", "some_hooks")
+ hooks["set_rh"] = []
+ hooks.install_named_hook('set_rh', None, "demo")
+ self.assertRaises(errors.UnsupportedOperation,
+ hooks.uninstall_named_hook, "set_rh", "demo")
+
hooks = Hooks("bzrlib.tests.test_hooks", "TestHooks.hooks")
def test_install_lazy_named_hook(self):
@@ -202,6 +239,19 @@
"my callback")
self.assertEqual([TestHook.lazy_callback], list(hook))
+ def test_uninstall(self):
+ hook = HookPoint("foo", "no docs", None, None)
+ hook.hook_lazy(
+ "bzrlib.tests.test_hooks", "TestHook.lazy_callback",
+ "my callback")
+ self.assertEqual([TestHook.lazy_callback], list(hook))
+ hook.uninstall("my callback")
+ self.assertEqual([], list(hook))
+
+ def test_uninstall_unknown(self):
+ hook = HookPoint("foo", "no docs", None, None)
+ self.assertRaises(KeyError, hook.uninstall, "my callback")
+
def test___repr(self):
# The repr should list all the callbacks, with names.
hook = HookPoint("foo", "no docs", None, None)
=== modified file 'doc/en/release-notes/bzr-2.4.txt'
--- a/doc/en/release-notes/bzr-2.4.txt 2011-04-01 01:46:42 +0000
+++ b/doc/en/release-notes/bzr-2.4.txt 2011-04-02 00:08:39 +0000
@@ -65,6 +65,8 @@
mysteriously silent.)
(Martin Pool)
+* New method ``Hooks.uninstall_named_hook``. (Jelmer Vernooij, #301472)
+
Internals
*********
More information about the bazaar-commits
mailing list