Mercurial > hg
view contrib/check-commit @ 23857:8a3c132f93d2
revlog: verify censored flag when hashing added revision fulltext
When receiving a delta via exchange, three possible storage outcomes emerge:
1. The delta is added directly to the revlog. ("fast-path")
2. A freshly-computed delta with a different base is stored.
3. The new revision's fulltext is computed and stored outright.
Both (2) and (3) require materializing the full text of the new revision by
applying the delta to its base. This is typically followed by a hash check.
The new flags argument allows callers to _addrevision to signal that they
expect that hash check to fail. We can use this opportunity to verify that
expectation. If the hash fails, require the flag be set; if the hash passes,
require the flag be unset.
Rather than simply eliding the hash check, this approach provides some
assurance that the censored flag is not applied to valid revisions.
Read more at: http://mercurial.selenic.com/wiki/CensorPlan
author | Mike Edgar <adgar@google.com> |
---|---|
date | Mon, 12 Jan 2015 14:41:25 -0500 |
parents | 15d0390a27fe |
children | ba272156113f |
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: 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", "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.*\.\s+$", "don't add trailing period on summary line"), (r"^# .*\n.{78,}", "summary line too long"), (r"^\+\n \n", "adds double empty line"), (r"\+\s+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)