mercurial/util.py
changeset 33793 bbbbd3c30bfc
parent 33737 02a745c20121
child 33799 05264fc9d8d6
--- a/mercurial/util.py	Mon Aug 14 16:26:36 2017 -0700
+++ b/mercurial/util.py	Fri Jul 28 22:42:10 2017 -0700
@@ -15,6 +15,7 @@
 
 from __future__ import absolute_import
 
+import abc
 import bz2
 import calendar
 import codecs
@@ -592,6 +593,31 @@
             for k, v in src:
                 self[k] = v
 
+class transactional(object):
+    """Base class for making a transactional type into a context manager."""
+    __metaclass__ = abc.ABCMeta
+
+    @abc.abstractmethod
+    def close(self):
+        """Successfully closes the transaction."""
+
+    @abc.abstractmethod
+    def release(self):
+        """Marks the end of the transaction.
+
+        If the transaction has not been closed, it will be aborted.
+        """
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        try:
+            if exc_type is None:
+                self.close()
+        finally:
+            self.release()
+
 @contextlib.contextmanager
 def acceptintervention(tr=None):
     """A context manager that closes the transaction on InterventionRequired