# HG changeset patch # User Martin von Zweigbergk # Date 1520634615 28800 # Node ID aff5996f30438d8808170d17eb5a7d2d9d8b2e74 # Parent f8b65ff02e3e607479b5d04b0609f60b698716a6 transaction: add a name and a __repr__ implementation (API) This has been useful for me for debugging. Differential Revision: https://phab.mercurial-scm.org/D2758 diff -r f8b65ff02e3e -r aff5996f3043 mercurial/localrepo.py --- a/mercurial/localrepo.py Fri Mar 09 16:10:55 2018 +0100 +++ b/mercurial/localrepo.py Fri Mar 09 14:30:15 2018 -0800 @@ -1177,7 +1177,7 @@ raise error.ProgrammingError('transaction requires locking') tr = self.currenttransaction() if tr is not None: - return tr.nest() + return tr.nest(name=desc) # abort here if the journal already exists if self.svfs.exists("journal"): @@ -1316,7 +1316,8 @@ self.store.createmode, validator=validate, releasefn=releasefn, - checkambigfiles=_cachedfiles) + checkambigfiles=_cachedfiles, + name=desc) tr.changes['revs'] = xrange(0, 0) tr.changes['obsmarkers'] = set() tr.changes['phases'] = {} diff -r f8b65ff02e3e -r aff5996f3043 mercurial/transaction.py --- a/mercurial/transaction.py Fri Mar 09 16:10:55 2018 +0100 +++ b/mercurial/transaction.py Fri Mar 09 14:30:15 2018 -0800 @@ -105,7 +105,7 @@ class transaction(util.transactional): def __init__(self, report, opener, vfsmap, journalname, undoname=None, after=None, createmode=None, validator=None, releasefn=None, - checkambigfiles=None): + checkambigfiles=None, name=r''): """Begin a new transaction Begins a new transaction that allows rolling back writes in the event of @@ -149,6 +149,8 @@ if checkambigfiles: self.checkambigfiles.update(checkambigfiles) + self.names = [name] + # A dict dedicated to precisely tracking the changes introduced in the # transaction. self.changes = {} @@ -186,6 +188,11 @@ # holds callbacks to call during abort self._abortcallback = {} + def __repr__(self): + name = r'/'.join(self.names) + return (r'' % + (name, self.count, self.usages)) + def __del__(self): if self.journal: self._abort() @@ -365,14 +372,17 @@ self.file.flush() @active - def nest(self): + def nest(self, name=r''): self.count += 1 self.usages += 1 + self.names.append(name) return self def release(self): if self.count > 0: self.usages -= 1 + if self.names: + self.names.pop() # if the transaction scopes are left without being closed, fail if self.count > 0 and self.usages == 0: self._abort()