# HG changeset patch # User Laurent Charignon # Date 1430430421 25200 # Node ID 676d88a82d4a6b8ce263577b8e0d0faf04085a41 # Parent 677c5da57b9c983ae449e9e9c342385ea599c7b5 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. diff -r 677c5da57b9c -r 676d88a82d4a hgext/evolve.py --- 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)