view contrib/lock-checker.py @ 19422:d9e86d656017

check-code: automatically preppend "warning: " to all warning messages Some warnings had "warning: " at the beginning of their message. Now this is done consistent for all messages. Especially in test-check-code-hg.t it is an advantage to see warnings at once because only exceptions to them are tolerated. It is (almost) as obvious as before a6180647ea. The prefix will not remain when a warning is changed to a failure. A change like a91387a37f will not be necessary anymore.
author Simon Heimberg <simohe@besonet.ch>
date Tue, 16 Jul 2013 01:29:14 +0200
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