changeset 23220:3f543f6be500

transaction: allow registering a post-close callback The addchangegroup code considers the transaction done after a 'tr.close()' call and schedules the hook's execution for after lock release. In the nested transaction case, the transaction is not yet committed and we must delay this scheduling. We add an 'addpostclose' method (like the 'addpending' and 'addfinalize' ones) that registers code to be run if the transaction is successfully committed.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Tue, 28 Oct 2014 14:24:43 +0100
parents 61cd79ac4b99
children cadc9a723d60
files mercurial/transaction.py
diffstat 1 files changed, 15 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/transaction.py	Fri Oct 24 15:58:46 2014 -0400
+++ b/mercurial/transaction.py	Tue Oct 28 14:24:43 2014 +0100
@@ -107,6 +107,8 @@
         self._anypending = False
         # holds callback to call when writing the transaction
         self._finalizecallback = {}
+        # hold callbalk for post transaction close
+        self._postclosecallback = {}
 
     def __del__(self):
         if self.journal:
@@ -299,6 +301,15 @@
         self._finalizecallback[category] = callback
 
     @active
+    def addpostclose(self, category, callback):
+        """add a callback to be called after the transaction is closed
+
+        Category is a unique identifier to allow overwriting an old callback
+        with a newer callback.
+        """
+        self._postclosecallback[category] = callback
+
+    @active
     def close(self):
         '''commit the transaction'''
         if self.count == 1 and self.onclose is not None:
@@ -324,6 +335,10 @@
                 self.opener.unlink(b)
         self.backupentries = []
         self.journal = None
+        # run post close action
+        categories = sorted(self._postclosecallback)
+        for cat in categories:
+            self._postclosecallback[cat]()
 
     @active
     def abort(self):