view contrib/check-commit @ 27319:b64b6fdc5c9b

discovery: properly filter changeset in 'peer.known' (issue4982) The 'peer.known' call (handled at the repository level) was applying its own manual filtering (looking at phases) instead of relying on the repoview mechanism. This led to the discovery finding more "common" node that 'getbundle' was willing to recognised. From there, bad things happen, issue4982 is a symptom of it. While situations like described in issue4982 can still happen because of race conditions, fixing 'peer.known' is important for consistency in all cases. We update the code to use 'repoview' filtering. This lead to small changes in the tests for exchanging obsolescence marker because the discovery yields different results. The test affected in 'test-obsolete-changeset-exchange.t' is a test for issue4982 getting back to its expected state.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Wed, 02 Dec 2015 16:12:15 -0800
parents 8f5735b4aca5
children e0465035def9
line wrap: on
line source

#!/usr/bin/env python
#
# Copyright 2014 Matt Mackall <mpm@selenic.com>
#
# A tool/hook to run basic sanity checks on commits/patches for
# submission to Mercurial. Install by adding the following to your
# .hg/hgrc:
#
# [hooks]
# pretxncommit = contrib/check-commit
#
# The hook can be temporarily bypassed with:
#
# $ BYPASS= hg commit
#
# See also: https://mercurial-scm.org/wiki/ContributingChanges

import re, sys, os

errors = [
    (r"[(]bc[)]", "(BC) needs to be uppercase"),
    (r"[(]issue \d\d\d", "no space allowed between issue and number"),
    (r"[(]bug(\d|\s)", "use (issueDDDD) instead of bug"),
    (r"^# User [^@\n]+$", "username is not an email address"),
    (r"^# .*\n(?!merge with )[^#]\S+[^:] ",
     "summary line doesn't start with 'topic: '"),
    (r"^# .*\n[A-Z][a-z]\S+", "don't capitalize summary lines"),
    (r"^# .*\n[^\n]*: *[A-Z][a-z]\S+", "don't capitalize summary lines"),
    (r"^# .*\n.*\.\s+$", "don't add trailing period on summary line"),
    (r"^# .*\n[^#].{77,}", "summary line too long (limit is 78)"),
    (r"^\+\n \n", "adds double empty line"),
    (r"^ \n\+\n", "adds double empty line"),
    (r"^\+[ \t]+def [a-z]+_[a-z]", "adds a function with foo_bar naming"),
]

node = os.environ.get("HG_NODE")

if node:
    commit = os.popen("hg export %s" % node).read()
else:
    commit = sys.stdin.read()

exitcode = 0
for exp, msg in errors:
    m = re.search(exp, commit, re.MULTILINE)
    if m:
        pos = 0
        for n, l in enumerate(commit.splitlines(True)):
            pos += len(l)
            if pos >= m.end():
                print "%d: %s" % (n, msg)
                print " %s" % l[:-1]
                if "BYPASS" not in os.environ:
                    exitcode = 1
                break

sys.exit(exitcode)