changeset 1308:676d88a82d4a stable

evolve: improve transaction related code to use the lock module Refactored some of the places where we are using locking in evolve to use the lock module and write less code. This should also fix a couple of bug where tr could be None at release time.
author Laurent Charignon <lcharignon@fb.com>
date Thu, 30 Apr 2015 14:47:01 -0700
parents 677c5da57b9c
children b621e5da03e1
files hgext/evolve.py
diffstat 1 files changed, 39 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/evolve.py	Thu Apr 30 14:40:36 2015 -0700
+++ b/hgext/evolve.py	Thu Apr 30 14:47:01 2015 -0700
@@ -2061,10 +2061,7 @@
                 repo._bookmarks.write()
         return result
     finally:
-        if lock is not None:
-            lock.release()
-        if wlock is not None:
-            wlock.release()
+        lockmod.release(lock, wlock)
 
 @command('^touch',
     [('r', 'rev', [], 'revision to update'),
@@ -2088,40 +2085,37 @@
         return 1
     if not duplicate and repo.revs('public() and %ld', revs):
         raise util.Abort("can't touch public revision")
-    wlock = lock = None
+    wlock = lock = tr = None
     try:
         wlock = repo.wlock()
         lock = repo.lock()
         tr = repo.transaction('touch')
         revs.sort() # ensure parent are run first
         newmapping = {}
-        try:
-            for r in revs:
-                ctx = repo[r]
-                extra = ctx.extra().copy()
-                extra['__touch-noise__'] = random.randint(0, 0xffffffff)
-                # search for touched parent
-                p1 = ctx.p1().node()
-                p2 = ctx.p2().node()
-                p1 = newmapping.get(p1, p1)
-                p2 = newmapping.get(p2, p2)
-                new, unusedvariable = rewrite(repo, ctx, [], ctx,
-                                              [p1, p2],
-                                              commitopts={'extra': extra})
-                # store touched version to help potential children
-                newmapping[ctx.node()] = new
-                if not duplicate:
-                    obsolete.createmarkers(repo, [(ctx, (repo[new],))])
-                phases.retractboundary(repo, tr, ctx.phase(), [new])
-                if ctx in repo[None].parents():
-                    repo.dirstate.beginparentchange()
-                    repo.dirstate.setparents(new, node.nullid)
-                    repo.dirstate.endparentchange()
-            tr.close()
-        finally:
-            tr.release()
+        for r in revs:
+            ctx = repo[r]
+            extra = ctx.extra().copy()
+            extra['__touch-noise__'] = random.randint(0, 0xffffffff)
+            # search for touched parent
+            p1 = ctx.p1().node()
+            p2 = ctx.p2().node()
+            p1 = newmapping.get(p1, p1)
+            p2 = newmapping.get(p2, p2)
+            new, unusedvariable = rewrite(repo, ctx, [], ctx,
+                                          [p1, p2],
+                                          commitopts={'extra': extra})
+            # store touched version to help potential children
+            newmapping[ctx.node()] = new
+            if not duplicate:
+                obsolete.createmarkers(repo, [(ctx, (repo[new],))])
+            phases.retractboundary(repo, tr, ctx.phase(), [new])
+            if ctx in repo[None].parents():
+                repo.dirstate.beginparentchange()
+                repo.dirstate.setparents(new, node.nullid)
+                repo.dirstate.endparentchange()
+        tr.close()
     finally:
-        lockmod.release(lock, wlock)
+        lockmod.release(tr, lock, wlock)
 
 @command('^fold|squash',
     [('r', 'rev', [], _("revision to fold")),
@@ -2574,18 +2568,16 @@
 @eh.addattr(localrepo.localpeer, 'evoext_pushobsmarkers_0')
 def local_pushobsmarkers(peer, obsfile):
     data = obsfile.read()
-    lock = peer._repo.lock()
+    tr = lock = None
     try:
+        lock = peer._repo.lock()
         tr = peer._repo.transaction('pushkey: obsolete markers')
-        try:
-            new = peer._repo.obsstore.mergemarkers(tr, data)
-            if new is not None:
-                obsexcmsg(peer._repo.ui, "%i obsolescence markers added\n" % new, True)
-            tr.close()
-        finally:
-            tr.release()
+        new = peer._repo.obsstore.mergemarkers(tr, data)
+        if new is not None:
+            obsexcmsg(peer._repo.ui, "%i obsolescence markers added\n" % new, True)
+        tr.close()
     finally:
-        lock.release()
+        lockmod.release(tr, lock)
     peer._repo.hook('evolve_pushobsmarkers')
 
 def srv_pushobsmarkers(repo, proto):
@@ -2595,18 +2587,16 @@
     proto.getfile(fp)
     data = fp.getvalue()
     fp.close()
-    lock = repo.lock()
+    tr = lock = None
     try:
+        lock = repo.lock()
         tr = repo.transaction('pushkey: obsolete markers')
-        try:
-            new = repo.obsstore.mergemarkers(tr, data)
-            if new is not None:
-                obsexcmsg(repo.ui, "%i obsolescence markers added\n" % new, True)
-            tr.close()
-        finally:
-            tr.release()
+        new = repo.obsstore.mergemarkers(tr, data)
+        if new is not None:
+            obsexcmsg(repo.ui, "%i obsolescence markers added\n" % new, True)
+        tr.close()
     finally:
-        lock.release()
+        lockmod.release(tr, lock)
     repo.hook('evolve_pushobsmarkers')
     return wireproto.pushres(0)