transaction: add onclose/onabort hook for pre-close logic
authorDurham Goode <durham@fb.com>
Mon, 24 Mar 2014 15:57:47 -0700
changeset 20881 3c47677a8d04
parent 20880 925c2d604389
child 20882 5dffd06f1e50
transaction: add onclose/onabort hook for pre-close logic Adds an optional onclose parameter to transactions that gets called just before the transaction is committed. This allows things that build up data over the course of the transaction (like the fncache) to commit their data. Also adds onabort. It's not used, but will allow extensions to hook into onclose and onabort to provide transaction support.
mercurial/transaction.py
--- a/mercurial/transaction.py	Mon Mar 24 15:38:20 2014 -0700
+++ b/mercurial/transaction.py	Mon Mar 24 15:57:47 2014 -0700
@@ -42,12 +42,27 @@
     opener.unlink(journal)
 
 class transaction(object):
-    def __init__(self, report, opener, journal, after=None, createmode=None):
+    def __init__(self, report, opener, journal, after=None, createmode=None,
+            onclose=None, onabort=None):
+        """Begin a new transaction
+
+        Begins a new transaction that allows rolling back writes in the event of
+        an exception.
+
+        * `after`: called after the transaction has been committed
+        * `createmode`: the mode of the journal file that will be created
+        * `onclose`: called as the transaction is closing, but before it is
+        closed
+        * `onabort`: called as the transaction is aborting, but before any files
+        have been truncated
+        """
         self.count = 1
         self.usages = 1
         self.report = report
         self.opener = opener
         self.after = after
+        self.onclose = onclose
+        self.onabort = onabort
         self.entries = []
         self.map = {}
         self.journal = journal
@@ -126,6 +141,9 @@
     @active
     def close(self):
         '''commit the transaction'''
+        if self.count == 1 and self.onclose is not None:
+            self.onclose()
+
         self.count -= 1
         if self.count != 0:
             return
@@ -149,6 +167,9 @@
         self.usages = 0
         self.file.close()
 
+        if self.onabort is not None:
+            self.onabort()
+
         try:
             if not self.entries:
                 if self.journal: