##// END OF EJS Templates
check-commit: support REVs as commandline arguments...
check-commit: support REVs as commandline arguments usage: * HG_NODE=REV check-commit * hg export REV | check-commit * check-commit REV ...

File last commit:

r27781:2af351bd default
r27781:2af351bd default
Show More
check-commit
74 lines | 2.4 KiB | text/plain | TextLexer
Matt Mackall
contrib: add check-commit hook script to sanity-check commits
r22043 #!/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
#
Matt Mackall
urls: bulk-change primary website URLs
r26421 # See also: https://mercurial-scm.org/wiki/ContributingChanges
Matt Mackall
contrib: add check-commit hook script to sanity-check commits
r22043
import re, sys, os
errors = [
(r"[(]bc[)]", "(BC) needs to be uppercase"),
(r"[(]issue \d\d\d", "no space allowed between issue and number"),
Pierre-Yves David
check-commit: be more picky about detection of wrong bug tag...
r24703 (r"[(]bug(\d|\s)", "use (issueDDDD) instead of bug"),
Matt Mackall
contrib: add check-commit hook script to sanity-check commits
r22043 (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"),
Eric Sumner
check-commit: check capitalization in summary lines...
r24049 (r"^# .*\n[^\n]*: *[A-Z][a-z]\S+", "don't capitalize summary lines"),
Matt Mackall
check-commit: try to curb bad commit summary keywords...
r27692 (r"^# [^\n]*\n\S*[^A-Za-z0-9-]\S*: ",
"summary keyword should be most user-relevant one-word command or topic"),
Matt Mackall
contrib: add check-commit hook script to sanity-check commits
r22043 (r"^# .*\n.*\.\s+$", "don't add trailing period on summary line"),
timeless
check-commit: fix summary length regexp
r27779 (r"^# .*\n[^#].{78,}", "summary line too long (limit is 78)"),
Matt Mackall
check-commit: spot growing whitespace...
r22058 (r"^\+\n \n", "adds double empty line"),
Yuya Nishihara
check-commit: catch both patterns of double empty lines
r25643 (r"^ \n\+\n", "adds double empty line"),
Gregory Szorc
check-commit: make foo_bar naming regexp less greedy...
r25379 (r"^\+[ \t]+def [a-z]+_[a-z]", "adds a function with foo_bar naming"),
Matt Mackall
contrib: add check-commit hook script to sanity-check commits
r22043 ]
timeless
check-commit: support REVs as commandline arguments...
r27781 def checkcommit(commit, node = None):
timeless
check-commit: modularize
r27780 exitcode = 0
timeless
check-commit: support REVs as commandline arguments...
r27781 printed = node is None
timeless
check-commit: modularize
r27780 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():
timeless
check-commit: support REVs as commandline arguments...
r27781 if not printed:
printed = True
print "node: %s" % node
timeless
check-commit: modularize
r27780 print "%d: %s" % (n, msg)
print " %s" % l[:-1]
if "BYPASS" not in os.environ:
exitcode = 1
break
return exitcode
Matt Mackall
contrib: add check-commit hook script to sanity-check commits
r22043
timeless
check-commit: modularize
r27780 def readcommit(node):
return os.popen("hg export %s" % node).read()
if __name__ == "__main__":
timeless
check-commit: support REVs as commandline arguments...
r27781 exitcode = 0
timeless
check-commit: modularize
r27780 node = os.environ.get("HG_NODE")
Matt Mackall
contrib: add check-commit hook script to sanity-check commits
r22043
timeless
check-commit: modularize
r27780 if node:
commit = readcommit(node)
timeless
check-commit: support REVs as commandline arguments...
r27781 exitcode = checkcommit(commit)
elif sys.argv[1:]:
for node in sys.argv[1:]:
exitcode |= checkcommit(readcommit(node), node)
timeless
check-commit: modularize
r27780 else:
commit = sys.stdin.read()
timeless
check-commit: support REVs as commandline arguments...
r27781 exitcode = checkcommit(commit)
timeless
check-commit: modularize
r27780 sys.exit(exitcode)