Subject: Re: [PATCH v2 1/3] builtin/commit-graph.c: support '--split[=<strategy>]'

From: Derrick Stolee <[email-masked]>
Date: Fri, 7 Feb 2020 10:48:39 -0500

On 2/6/2020 2:41 PM, Martin Ågren wrote:
> On Wed, 5 Feb 2020 at 01:28, Taylor Blau <[email-masked]> wrote:
>>  * If `--size-multiple=<X>` is not specified, let `X` equal 2. If the new
>>  tip file would have `N` commits and the previous tip has `M` commits and
> 
>> -               OPT_BOOL(0, "split", &opts.split,
>> -                       N_("allow writing an incremental commit-graph file")),
>> +               OPT_CALLBACK_F(0, "split", &split_opts.flags, NULL,
>> +                       N_("allow writing an incremental commit-graph file"),
>> +                       PARSE_OPT_OPTARG | PARSE_OPT_NONEG,
>> +                       write_option_parse_split),
> 
> 
> I keep getting back to this -- sorry! So this actually forbids
> "--no-split", which used to work before. Unfortunate?

That certainly is unfortunate. Hopefully no one is taking a dependence on
this, which only means something if they had a `--split` previously in
the command-line arguments.

> I have to ask, what is the long-term plan for the two formats (split and
> non-split)? As I understand it, and I might well be wrong, the non-split
> format came first and the split format was a user-experience
> improvement. Should we expect that `--split` becomes the default?

In some ways, the split is now the default because that is how it is
written during 'git fetch' using fetch.writeCommitGraph. However, I
don't think that it will ever become the default for the commit-graph
builtin.

> In
> which case `--no-split` would be needed. Or might the non-split format
> go away entirely, leaving `--split` a no-op and `--split=<strategy>` a
> pretty funky way of choosing a strategy for the one-and-only file
> format?

In some ways, the --split=merge-all is similar, except it writes a one-line
commit-graph-chain file and puts a .graph file in
.git/objects/info/commit-graphs instead of writing to .git/objects/commit-graph.

> To try to be concrete, here's a suggestion: `--format=split` and
> `--split-strategy=<strategy>`.

Why --format=split instead of leaving it as --[no-]split? Is there a reason to
introduce this string-based option when there are only two options right now?

Perhaps using --split-strategy=<strategy> is the most backwards-compatible
option, especially because we won't need --split="" to substitute for
"auto-merge". However, I wonder if this is a case where we should make the
hard choice to sacrifice a narrow backwards-compatibility in favor of a
simplified set of options?

Thanks,
-Stolee