Skip to content
Snippets Groups Projects
Commit 1d2bff31 authored by Dan Villiom Podlaski Christiansen's avatar Dan Villiom Podlaski Christiansen
Browse files

tests: copy over commit check from mercurial

parent cb41e9a3
No related branches found
No related tags found
1 merge request!138CI: Add some style checks for code & commits
......@@ -21,11 +21,6 @@
<https://www.mercurial-scm.org/wiki/ContributingChanges>`_. Key
differences are (by rule number):
1
For hg-git, we're not strict about the ``topic: a few words`` format
for the first line, but do insist on a sensible summary as the first
commit line.
2
You can cross-reference Heptapod issues in the ``#NNN`` format.
......
#!/usr/bin/env python3
#
# 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
from __future__ import absolute_import, print_function
import os
import re
import sys
commitheader = r"^(?:# [^\n]*\n)*"
afterheader = commitheader + r"(?!#)"
beforepatch = afterheader + r"(?!\n(?!@@))"
errors = [
(beforepatch + r".*[(]bc[)]", "(BC) needs to be uppercase"),
(
beforepatch + r".*[(]issue \d\d\d",
"no space allowed between issue and number",
),
(beforepatch + r".*[(]bug(\d|\s)", "use (issueDDDD) instead of bug"),
(commitheader + r"# User [^@\n]+\n", "username is not an email address"),
(
commitheader + r"(?!merge with )[^#]\S+[^:] ",
"summary line doesn't start with 'topic: '",
),
(afterheader + r"[A-Z][a-z]\S+", "don't capitalize summary lines"),
(afterheader + r"^\S+: *[A-Z][a-z]\S+", "don't capitalize summary lines"),
(
afterheader + r"\S*[^A-Za-z0-9-_]\S*: ",
"summary keyword should be most user-relevant one-word command or topic",
),
(afterheader + r".*\.\s*\n", "don't add trailing period on summary line"),
(afterheader + r".{79,}", "summary line too long (limit is 78)"),
]
word = re.compile(r'\S')
def nonempty(first, second):
if word.search(first):
return first
return second
def checkcommit(commit, node=None):
exitcode = 0
printed = node is None
hits = []
signtag = (
afterheader + r'Added (tag [^ ]+|signature) for changeset [a-f0-9]{12}'
)
if re.search(signtag, commit):
return 0
for exp, msg in errors:
for m in re.finditer(exp, commit):
end = m.end()
trailing = re.search(r'(\\n)+$', exp)
if trailing:
end -= len(trailing.group()) / 2
hits.append((end, exp, msg))
if hits:
hits.sort()
pos = 0
last = ''
for n, l in enumerate(commit.splitlines(True)):
pos += len(l)
while len(hits):
end, exp, msg = hits[0]
if pos < end:
break
if not printed:
printed = True
print("node: %s" % node)
print("%d: %s" % (n, msg))
print(" %s" % nonempty(l, last)[:-1])
if "BYPASS" not in os.environ:
exitcode = 1
del hits[0]
last = nonempty(l, last)
return exitcode
def readcommit(node):
return os.popen("hg export %s" % node).read()
if __name__ == "__main__":
exitcode = 0
node = os.environ.get("HG_NODE")
if node:
commit = readcommit(node)
exitcode = checkcommit(commit)
elif sys.argv[1:]:
for node in sys.argv[1:]:
exitcode |= checkcommit(readcommit(node), node)
else:
commit = sys.stdin.read()
exitcode = checkcommit(commit)
sys.exit(exitcode)
#require test-repo py3
Load commonly used test logic
$ . "$TESTDIR/testutil"
Enable obsolescence to avoid the warning issue when obsmarker are found
$ . "$TESTDIR/helpers-testrepo.sh"
We might be running the tests as a different user than checked out the
code
$ cat >> $HGRCPATH <<EOF
> [trusted]
> users = *
> groups = *
> EOF
Go back in the hg repo
$ cd $TESTDIR/..
$ REVSET='not public() and ::. and not desc("# no-check-commit")'
$ mkdir "$TESTTMP/p"
$ REVS=`testrepohg log -r "$REVSET" -T.`
$ if [ -n "$REVS" ] ; then
> testrepohg export --git -o "$TESTTMP/p/%n-%h" -r "$REVSET"
> for f in `ls "$TESTTMP/p"`; do
> contrib/check-commit < "$TESTTMP/p/$f" > "$TESTTMP/check-commit.out"
> if [ $? -ne 0 ]; then
> node="${f##*-}"
> echo "Revision $node does not comply with rules"
> echo '------------------------------------------------------'
> cat ${TESTTMP}/check-commit.out
> echo
> fi
> done
> fi
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment