Mercurial > hg
view contrib/check-commit @ 24843:21b33f0460e0 stable
revert: apply normallookup on reverted file if size isn't changed (issue4583)
Before this patch, reverting a file to the revision other than the
parent doesn't update dirstate. This seems to expect that timestamp
and/or size will be changed by reverting.
But if (1) dirstate of file "f" is filled with timestamp before
reverting and (2) size and timestamp of file "f" isn't changed at
reverting, file "f" is recognized as CLEAN unexpectedly.
This patch applies "dirstate.normallookup()" on reverted file, if size
isn't changed.
Making "localrepository.wwrite()" return length of written data is
needed to avoid additional (and redundant) "lstat(2)" on the reverted
file. "filectx.size()" can't be used to know it, because data may be
decoded at being written out.
BTW, interactive reverting may cause similar problem, too. But this
patch doesn't focus on fixing it, because (1) interactive (maybe slow)
reverting changes one (or both) of size/timestamp of reverted files in
many usecases, and (2) changes to fix it seems not suitable for stable
branch.
author | FUJIWARA Katsunori <foozy@lares.dti.ne.jp> |
---|---|
date | Fri, 24 Apr 2015 23:52:41 +0900 |
parents | 868cec6409c4 |
children | 85fc79707cb2 |
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(\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"), (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)