transaction: turn a transaction into a Python context manager
authorBryan O'Sullivan <bryano@fb.com>
Fri, 15 Jan 2016 13:14:47 -0800
changeset 27862 b2145c195f24
parent 27861 3315a9c2019c
child 27863 ed59ae8b025e
transaction: turn a transaction into a Python context manager This lets us greatly simply acquire/release cycles. If the block completes without raising an exception, the transaction is closed. Code pattern before: try: tr = repo.transaction('x') # zillions of lines of code tr.close() finally: tr.release() And after: with tr.transaction('x'): # ...
mercurial/transaction.py
--- a/mercurial/transaction.py	Fri Jan 15 13:14:49 2016 -0800
+++ b/mercurial/transaction.py	Fri Jan 15 13:14:47 2016 -0800
@@ -333,6 +333,14 @@
         if self.count > 0 and self.usages == 0:
             self._abort()
 
+    def __enter__(self):
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        if exc_type is None:
+            self.close()
+        self.release()
+
     def running(self):
         return self.count > 0