]> arthur.barton.de Git - bup.git/commitdiff
Drop @contextmanager from finalized() and buptest
authorRob Browning <rlb@defaultvalue.org>
Fri, 24 Jun 2022 16:17:48 +0000 (11:17 -0500)
committerRob Browning <rlb@defaultvalue.org>
Sat, 25 Jun 2022 18:26:11 +0000 (13:26 -0500)
Because it involves a generator, @contextmanager creates managers that
are incompatible with ExitStack.pop_all() because they close during
that call -- exactly what pop_all() is intended to avoid.

So begin dropping @contextmanager in preference to explicit context
management classes/methods.

cf. https://github.com/python/cpython/issues/88458

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
lib/bup/helpers.py
test/lib/buptest/__init__.py

index a2ac6be5e0568740d00cfa3f030555d05bc00b9d..a14cb1eeb9fc488419992484616eb98fc59d1bbe 100644 (file)
@@ -2,7 +2,7 @@
 
 from __future__ import absolute_import, division
 from collections import namedtuple
-from contextlib import contextmanager
+from contextlib import ExitStack
 from ctypes import sizeof, c_void_p
 from math import floor
 from os import environ
@@ -31,15 +31,15 @@ def nullcontext_if_not(manager):
     return manager if manager is not None else nullcontext()
 
 
-@contextmanager
-def finalized(enter_result=None, finalize=None):
-    assert finalize
-    try:
-        yield enter_result
-    except BaseException as ex:
-        with pending_raise(ex):
-            finalize(enter_result)
-    finalize(enter_result)
+class finalized:
+    def __init__(self, enter_result=None, finalize=None):
+        assert finalize
+        self.finalize = finalize
+        self.enter_result = enter_result
+    def __enter__(self):
+        return self.enter_result
+    def __exit__(self, exc_type, exc_value, traceback):
+        self.finalize(self.enter_result)
 
 
 sc_page_size = os.sysconf('SC_PAGE_SIZE')
index e2b5284da6eca9aacd04fc4a53b40e7d59ee568d..627a8e6f1c5a2b5a6effc2b84bd7f82a2d777aff 100644 (file)
@@ -1,7 +1,6 @@
 
 from __future__ import absolute_import, print_function
 from collections import namedtuple
-from contextlib import contextmanager
 from os.path import abspath, basename, dirname, realpath
 from pipes import quote
 from subprocess import PIPE, Popen