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