diff -r 925c2d604389 -r 3c47677a8d04 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: