lock-checker.py
39 lines
| 1.3 KiB
| text/x-python
|
PythonLexer
/ contrib / lock-checker.py
Augie Fackler
|
r17669 | """Extension to verify locks are obtained in the required places. | ||
This works by wrapping functions that should be surrounded by a lock | ||||
and asserting the lock is held. Missing locks are called out with a | ||||
traceback printed to stderr. | ||||
This currently only checks store locks, not working copy locks. | ||||
""" | ||||
import os | ||||
Mads Kiilerich
|
r20244 | from mercurial import util | ||
Augie Fackler
|
r17669 | |||
def _checklock(repo): | ||||
l = repo._lockref and repo._lockref() | ||||
if l is None or not l.held: | ||||
Mads Kiilerich
|
r20244 | util.debugstacktrace('missing lock', skip=1) | ||
Augie Fackler
|
r17669 | |||
def reposetup(ui, repo): | ||||
orig = repo.__class__ | ||||
class lockcheckrepo(repo.__class__): | ||||
def _writejournal(self, *args, **kwargs): | ||||
_checklock(self) | ||||
return orig._writejournal(self, *args, **kwargs) | ||||
def transaction(self, *args, **kwargs): | ||||
_checklock(self) | ||||
return orig.transaction(self, *args, **kwargs) | ||||
# TODO(durin42): kiilerix had a commented-out lock check in | ||||
Mads Kiilerich
|
r17738 | # _writebranchcache and _writerequirements | ||
Augie Fackler
|
r17669 | |||
def _tag(self, *args, **kwargs): | ||||
_checklock(self) | ||||
return orig._tag(self, *args, **kwargs) | ||||
def write(self, *args, **kwargs): | ||||
assert os.path.lexists(self._join('.hg/wlock')) | ||||
return orig.write(self, *args, **kwargs) | ||||
repo.__class__ = lockcheckrepo | ||||