# HG changeset patch # User Matt Harbison # Date 1490327243 14400 # Node ID 0febf8e4e2ce11c09708346a950fb063191f6a65 # Parent c208bc65318a69deba8f7e1b6be5bfddd899cf14 repair: use context manager for lock management If repo.lock() raised inside of the try block, 'tr' would have been None in the finally block where it tries to release(). Modernize the syntax instead of just winching the lock out of the try block. I found several other instances of acquiring the lock inside of the 'try', but those finally blocks handle None references. I also started switching some trivial try/finally blocks to context managers, but didn't get them all because indenting over 3x for lock, wlock and transaction would have spilled over 80 characters. That got me wondering if there should be a repo.rwlock(), to handle locking and unlocking in the proper order. It also looks like py27 supports supports multiple context managers for a single 'with' statement. Should I hold off on the rest until py26 is dropped? diff -r c208bc65318a -r 0febf8e4e2ce mercurial/repair.py --- a/mercurial/repair.py Fri Mar 24 19:52:43 2017 -0700 +++ b/mercurial/repair.py Thu Mar 23 23:47:23 2017 -0400 @@ -214,15 +214,10 @@ for m in updatebm: bm[m] = repo[newbmtarget].node() - lock = tr = None - try: - lock = repo.lock() - tr = repo.transaction('repair') - bm.recordchange(tr) - tr.close() - finally: - tr.release() - lock.release() + + with repo.lock(): + with repo.transaction('repair') as tr: + bm.recordchange(tr) # remove undo files for undovfs, undofile in repo.undofiles():