Mercurial > evolve
diff hgext/evolve.py @ 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 |
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)