Patchwork [3,of,7,V3] transaction: add onclose/onabort hook for pre-close logic

login
register
mail settings
Submitter Durham Goode
Date April 1, 2014, 10:24 p.m.
Message ID <c30d14f2883142087dfa.1396391053@dev2000.prn2.facebook.com>
Download mbox | patch
Permalink /patch/4186/
State Accepted
Commit 3c47677a8d04bc3bdc271a9ec36bbfc4f66781ed
Headers show

Comments

Durham Goode - April 1, 2014, 10:24 p.m.
# HG changeset patch
# User Durham Goode <durham@fb.com>
# Date 1395701867 25200
#      Mon Mar 24 15:57:47 2014 -0700
# Node ID c30d14f2883142087dfa5cdb61ca9be9e96acb09
# Parent  ecb8208fdf2ddb4e237f64d8eb2cc42982c4f050
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.

Patch

diff --git a/mercurial/transaction.py b/mercurial/transaction.py
--- a/mercurial/transaction.py
+++ b/mercurial/transaction.py
@@ -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: