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)