[PATCH 3 of 7] transaction: add onclose hook for pre-close logic

Durham Goode durham at fb.com
Tue Mar 25 20:45:05 CDT 2014


On 3/25/14 6:23 PM, "David Soria Parra" <davidsp at fb.com> wrote:

>Durham Goode <durham at fb.com> writes:
>
>> # HG changeset patch
>> # User Durham Goode <durham at fb.com>
>> # Date 1395701867 25200
>> #      Mon Mar 24 15:57:47 2014 -0700
>> # Node ID c84f51f8f92e0a3db4888ac9739f43fd866cac20
>> # Parent  08595987c5b0e8af5aa8fec4debd7260f5a79e8f
>> transaction: add onclose 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.
>>
>> diff --git a/mercurial/transaction.py b/mercurial/transaction.py
>> --- a/mercurial/transaction.py
>> +++ b/mercurial/transaction.py
>> @@ -42,12 +42,14 @@
>>      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):
>>          self.count = 1
>>          self.usages = 1
>>          self.report = report
>>          self.opener = opener
>>          self.after = after
>> +        self.onclose = onclose
>>          self.entries = []
>>          self.map = {}
>>          self.journal = journal
>> @@ -126,6 +128,9 @@
>>      @active
>>      def close(self):
>>          '''commit the transaction'''
>> +        if self.count == 1 and self.onclose:
>> +            self.onclose()
>> +
>I think we can do a
>
>  if self.onclose:
>     self.onclose()
>
>just after
>
>  self.count -= 1
>  if self.count != 0:
>    return
>
>so together with the rest of the actions done
>the last reference is closed.

I thought about that, but if onclose throws an exception, the tr.release()
won't call abort if self.count == 0.  So I need to do onclose before count
is decremented.



More information about the Mercurial-devel mailing list