Patchwork D2758: transaction: add a name and a __str__ implementation (API)

login
register
mail settings
Submitter phabricator
Date March 9, 2018, 6:38 p.m.
Message ID <differential-rev-PHID-DREV-gaotqa7pokrevnclnn7k-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/29181/
State Superseded
Headers show

Comments

phabricator - March 9, 2018, 6:38 p.m.
martinvonz created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  This has been useful for me for debugging.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D2758

AFFECTED FILES
  mercurial/localrepo.py
  mercurial/transaction.py

CHANGE DETAILS




To: martinvonz, #hg-reviewers
Cc: mercurial-devel
phabricator - March 9, 2018, 10:20 p.m.
durin42 added a comment.


  Either way, you should make sure this always returns a sysstr, otherwise you'll cause pretty terrible python3 breakage. Look around for other __repr__ instances for examples.

INLINE COMMENTS

> transaction.py:191
>  
> +    def __str__(self):
> +        name = '/'.join(self.names)

nit: I think this would make more sense as a __repr__ than a __str__.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D2758

To: martinvonz, #hg-reviewers
Cc: durin42, mercurial-devel
phabricator - March 9, 2018, 10:28 p.m.
martinvonz added a comment.


  Done

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D2758

To: martinvonz, #hg-reviewers
Cc: durin42, mercurial-devel

Patch

diff --git a/mercurial/transaction.py b/mercurial/transaction.py
--- a/mercurial/transaction.py
+++ b/mercurial/transaction.py
@@ -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='<unnamed>'):
         """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 __str__(self):
+        name = '/'.join(self.names)
+        return ('<transaction name=%s, count=%d, usages=%d>' %
+                (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='<unnamed>'):
         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()
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -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'] = {}