Comments
Patch
@@ -1199,23 +1199,24 @@ class localrepository(object):
def wlock(self, wait=True):
'''Lock the non-store parts of the repository (everything under
.hg except .hg/store) and return a weak reference to the lock.
Use this before modifying files in .hg.'''
+ l = self._wlockref and self._wlockref()
+ if l is not None and l.held:
+ l.lock()
+ return l
+
if (self.ui.configbool('devel', 'all')
or self.ui.configbool('devel', 'check-locks')):
l = self._lockref and self._lockref()
if l is not None and l.held:
msg = '"lock" taken before "wlock"\n'
if self.ui.tracebackflag:
util.debugstacktrace(msg, 1)
else:
self.ui.write_err(msg)
- l = self._wlockref and self._wlockref()
- if l is not None and l.held:
- l.lock()
- return l
def unlock():
if self.dirstate.pendingparentchange():
self.dirstate.invalidate()
else:
@@ -13,10 +13,26 @@
> tr = repo.transaction('buggy')
> lo = repo.lock()
> wl = repo.wlock()
> wl.release()
> lo.release()
+ >
+ > @command('properlocking', [], '')
+ > def properlocking(ui, repo):
+ > """check that reentrance is fine"""
+ > wl = repo.wlock()
+ > lo = repo.lock()
+ > tr = repo.transaction('proper')
+ > tr2 = repo.transaction('proper')
+ > lo2 = repo.lock()
+ > wl2 = repo.wlock()
+ > wl2.release()
+ > lo2.release()
+ > tr2.close()
+ > tr.close()
+ > lo.release()
+ > wl.release()
> EOF
$ cat << EOF >> $HGRCPATH
> [extensions]
> buggylocking=$TESTTMP/buggylocking.py
@@ -62,6 +78,7 @@
*/mercurial/dispatch.py:* in _runcommand (glob)
*/mercurial/dispatch.py:* in checkargs (glob)
*/mercurial/dispatch.py:* in <lambda> (glob)
*/mercurial/util.py:* in check (glob)
$TESTTMP/buggylocking.py:* in buggylocking (glob)
+ $ hg properlocking
$ cd ..