[PATCH 1 of 2] verify: document corner cases

Jun Wu quark at fb.com
Wed Mar 29 17:56:11 EDT 2017


Excerpts from Jun Wu's message of 2017-03-29 14:51:59 -0700:
> # 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
                                                               ^^^^
                                                 This should be "L3 (?)"
                If that does not get fixed in flight. I'll send a follow up.

> +                #
> +                # 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