[PATCH 1 of 2] verify: document corner cases
Jun Wu
quark at fb.com
Wed Mar 29 21:51:59 UTC 2017
# HG changeset patch
# User Jun Wu <quark at fb.com>
# Date 1490823901 25200
# Wed Mar 29 14:45:01 2017 -0700
# Node ID 1f7890370b5437466534cbd0a313d21671dade03
# Parent e9fda3b8614a8b701bd48041afa8b709e1227f27
# Available At https://bitbucket.org/quark-zju/hg-draft
# hg pull https://bitbucket.org/quark-zju/hg-draft -r 1f7890370b54
verify: document corner cases
It seems a good idea to list all kinds of "surprises" and expected behavior
to make the upcoming changes easier to understand.
Note: the comment added do not reflect the actual behavior of the current
code.
diff --git a/mercurial/verify.py b/mercurial/verify.py
--- a/mercurial/verify.py
+++ b/mercurial/verify.py
@@ -381,4 +381,44 @@ class verifier(object):
# verify contents
+ #
+ # Define 4 cases to help understand corner cases:
+ #
+ # | common | rename | meta | ext
+ # -------------------------------------------------------
+ # flags() | 0 | 0 | 0 | not 0
+ # renamed() | False | True | False | ?
+ # rawtext[0:2]=='\1\n'| False | True | True | ?
+ #
+ # "rawtext" means the raw text stored in revlog data, which
+ # could be retrieved by "revision(rev, raw=True)". "text"
+ # mentioned below is "revision(rev, raw=False)".
+ #
+ # There are 3 different lengths stored physically:
+ # 1. L1: rawsize, stored in revlog index
+ # 2. L2: len(rawtext), stored in revlog data
+ # 3. L3: len(text), stored in revlog data if flags=0, or
+ # possibly somewhere else if flags!=0
+ #
+ # L1 should be equal to L2. L3 is unrelated to L1 or L2. But
+ # text may or may not affect commit hash depending on flag
+ # processors (see revlog.addflagprocessor).
+ #
+ # | common | rename | meta | ext
+ # -------------------------------------------------
+ # rawsize() | L1 | L1 | L1 | L1
+ # size() | L1 | L2-LM | L1(*) | L1 (?)
+ # len(rawtext) | L2 | L2 | L2 | L2
+ # len(text) | L2 | L2 | L2 | L3
+ # len(read()) | L2 | L2-LM | L2-LM | L3
+ #
+ # LM: length of metadata, depending on rawtext
+ # (*): not ideal, see comment in filelog.size
+ # (?): could be "- len(meta)" if the resolved content has
+ # rename metadata
+ #
+ # Checks needed to be done:
+ # 1. length check: L1 == L2, in all cases.
+ # 2. hash check: depending on flag processor, we may need to
+ # use either "text" (external), or "rawtext" (in revlog).
try:
l = len(fl.read(n))
More information about the Mercurial-devel
mailing list