contrib/check-commit
author Anton Shestakov <av6@dwimlabs.net>
Fri, 12 Jun 2015 18:34:10 +0800
changeset 25526 32f76eccbced
parent 25379 894bcdbb9e7a
child 25643 6f6c97d29a1e
permissions -rwxr-xr-x
hgweb: don't point file links at tip hash where it doesn't make sense Some pages, e.g. bookmarks, help and summary don't have a meaningful revision context: they always either show information about tip or about the whole repo (and not about any specific changeset). And error pages can just show hgweb error messages, not related to any repo or changeset. Having a hash in the links worked (even when '{node|short}' resolved to an empty string on error pages), but seeing pages without revision context provide links with hashes is a bit confusing (unless you keep current tip hash in your head at all times) and not consistent with other template styles and other links on the same page: they don't have a hash. Let's just link to '/file', which is equal to '/file/tip'.

#!/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: http://mercurial.selenic.com/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.{78,}", "summary line too long (limit is 78)"),
    (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)