contrib/lock-checker.py
author Pierre-Yves David <pierre-yves.david@fb.com>
Mon, 29 Dec 2014 18:35:23 -0800
changeset 23720 8ec03e0ef51a
parent 20244 47d0843647d1
permissions -rw-r--r--
linkrev-filelog: handle filtered linkrev with no visible children (issue4307) If the file revision with a filtered linkrev does not have any (unfiltered) children, we cannot use it to bound the search for another introduction. Instead, we have to look at the file revision used by each head changeset. If one of them uses this file revision, we know there is another occurrence and we have a starting point. See inline comments for details. Adding some kind of permanent reference of all the introductions of a file revision instead of just the first one would be much better. But this is more difficult. I hope to take that into account in the next repository format.

"""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
from mercurial import util

def _checklock(repo):
    l = repo._lockref and repo._lockref()
    if l is None or not l.held:
        util.debugstacktrace('missing lock', skip=1)

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