Mercurial > hg
view contrib/lock-checker.py @ 18451:d6b3b36f1db2
branchmap: display filtername when `updatebranch` fails to do its jobs
We have a very handy assert at the ends of `branchmap.updatecache` that check
the resulting branchmap is actually valid.
I know we do not like assert in mercurial but this one is very handy for
debugging. There is really not reason for `branchmap.updatecache` to have this
kind of issue but this happened and handful of time during the development of
this or introduction of other related feature. I advice to keep it around until
we are a bit more confident with the new code.
author | Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
---|---|
date | Sat, 19 Jan 2013 02:29:56 +0100 |
parents | b8424c92ba2b |
children | 47d0843647d1 |
line wrap: on
line source
"""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 import traceback def _warnstack(ui, msg, skip=1): '''issue warning with the message and the current stack, skipping the skip last entries''' ui.warn('%s at:\n' % msg) entries = traceback.extract_stack()[:-skip] fnmax = max(len(entry[0]) for entry in entries) for fn, ln, func, _text in entries: ui.warn(' %*s:%-4s in %s\n' % (fnmax, fn, ln, func)) def _checklock(repo): l = repo._lockref and repo._lockref() if l is None or not l.held: _warnstack(repo.ui, 'missing lock', skip=2) 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 # _writebranchcache and _writerequirements 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