Subject: Re: [PATCH v3 5/6] commit-graph: implement file format version 2

From: Ævar Arnfjörð Bjarmason <[email-masked]>
Date: Wed, 01 May 2019 21:12:59 +0200

On Wed, May 01 2019, Derrick Stolee via GitGitGadget wrote:

>   3. Git did not fail with error if the unused eighth byte was
>      non-zero, so we could not use that to indicate an incremental
>      file format without breaking compatibility across versions.

This isn't new, I just missed this the last time around. I don't see how
this makes any sense.

On the current v1 graph code you can apply this patch and everything
continues to work because we ignore this padding byte:

    -       hashwrite_u8(f, 0); /* unused padding byte */
    +       hashwrite_u8(f, 1); /* unused padding byte */

But now after ab/commit-graph-fixes just got finished fixed the version
bump being a hard error of:

    error: graph version 2 does not match version 1

This v2 code is basically, as I understand it, introducing two ways of
expressing the version, so e.g. we might have v2 graphs with "0" here
changed to "1" for an incremental version of "2.1".

OK, let's try that then, on top of this series:

    diff --git a/commit-graph.c b/commit-graph.c
    index 5eebba6a0f..36c8cdb950 100644
    --- a/commit-graph.c
    +++ b/commit-graph.c
    @@ -1127,7 +1127,7 @@ int write_commit_graph(const char *obj_dir,
            case 2:
                    hashwrite_u8(f, num_chunks);
                    hashwrite_u8(f, 1); /* reachability index version */
    -               hashwrite_u8(f, 0); /* unused padding byte */
    +               hashwrite_u8(f, 1); /* unused padding byte */

Then:

    $ ~/g/git/git --exec-path=$PWD commit-graph write --version=2; ~/g/git/git --exec-path=$PWD status
    Expanding reachable commits in commit graph: 100% (201645/201645), done.
    Computing commit graph generation numbers: 100% (200556/200556), done.
    error: unsupported value in commit-graph header
    HEAD detached at pr-112/derrickstolee/graph/v2-head-v3

So we'll error out in the same way as if "2.0" was changed to "3.0" with
this "2.1" change, just with a more cryptic error message on this new v2
code.

I don't see how this is meaningfully different from just bumping the
version to "3". We abort parsing the graph just like with major version
changes.