# HG changeset patch # User Pierre-Yves David # Date 1426046625 25200 # Node ID 026f8af88e49ae11ef4e5af3acb0c6171c50aaf8 # Parent 32e16e9cf2cf822c9aa968f9a5cb304297e68f61 devel: also warn about transaction started without a lock Nobody should start a transaction on an unlocked repository. If developer warnings are enabled this will be reported. This use the same config as bad locking order since this is closely related. diff -r 32e16e9cf2cf -r 026f8af88e49 mercurial/localrepo.py --- a/mercurial/localrepo.py Tue Mar 10 21:25:11 2015 -0700 +++ b/mercurial/localrepo.py Tue Mar 10 21:03:45 2015 -0700 @@ -919,6 +919,15 @@ return None def transaction(self, desc, report=None): + if (self.ui.configbool('devel', 'all') + or self.ui.configbool('devel', 'check-locks')): + l = self._lockref and self._lockref() + if l is None or not l.held: + msg = 'transaction with no lock\n' + if self.ui.tracebackflag: + util.debugstacktrace(msg, 1) + else: + self.ui.write_err(msg) tr = self.currenttransaction() if tr is not None: return tr.nest() diff -r 32e16e9cf2cf -r 026f8af88e49 tests/test-devel-warnings.t --- a/tests/test-devel-warnings.t Tue Mar 10 21:25:11 2015 -0700 +++ b/tests/test-devel-warnings.t Tue Mar 10 21:03:45 2015 -0700 @@ -10,6 +10,7 @@ > > @command('buggylocking', [], '') > def buggylocking(ui, repo): + > tr = repo.transaction('buggy') > lo = repo.lock() > wl = repo.wlock() > EOF @@ -24,6 +25,7 @@ $ hg init lock-checker $ cd lock-checker $ hg buggylocking + transaction with no lock "lock" taken before "wlock" $ cat << EOF >> $HGRCPATH > [devel] @@ -31,8 +33,22 @@ > check-locks=1 > EOF $ hg buggylocking + transaction with no lock "lock" taken before "wlock" $ hg buggylocking --traceback + transaction with no lock + at: + */hg:* in (glob) + */mercurial/dispatch.py:* in run (glob) + */mercurial/dispatch.py:* in dispatch (glob) + */mercurial/dispatch.py:* in _runcatch (glob) + */mercurial/dispatch.py:* in _dispatch (glob) + */mercurial/dispatch.py:* in runcommand (glob) + */mercurial/dispatch.py:* in _runcommand (glob) + */mercurial/dispatch.py:* in checkargs (glob) + */mercurial/dispatch.py:* in (glob) + */mercurial/util.py:* in check (glob) + $TESTTMP/buggylocking.py:* in buggylocking (glob) "lock" taken before "wlock" at: */hg:* in (glob)