Mercurial > hg
view contrib/check-commit @ 24565:2f7cb6e6acdd
repoview: improve compute staticblockers perf
Previously we would compute the repoview's static blockers by finding all the
children of hidden commits that were not hidden. This was O(number of commits
since first hidden change) since 'children' requires walking every commit from
tip until the first hidden change.
The new algorithm walks all heads down until it sees a public commit. This makes
the computation O(number of draft) commits, which is much faster in large
repositories with a large number of commits and a low number of drafts.
On a large repo with 1000+ obsolete markers and the earliest draft commit around
tip~200000, this improves computehidden perf by 200x (2s to 0.01s).
author | Durham Goode <durham@fb.com> |
---|---|
date | Wed, 01 Apr 2015 12:50:10 -0700 |
parents | ba272156113f |
children | 868cec6409c4 |
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[^\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)