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'):
# ...
--- 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