]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/commit-graph.c: support for '--split[=<strategy>]'
authorTaylor Blau <me@ttaylorr.com>
Tue, 14 Apr 2020 04:04:08 +0000 (22:04 -0600)
committerJunio C Hamano <gitster@pobox.com>
Wed, 15 Apr 2020 16:20:26 +0000 (09:20 -0700)
With '--split', the commit-graph machinery writes new commits in another
incremental commit-graph which is part of the existing chain, and
optionally decides to condense the chain into a single commit-graph.
This is done to ensure that the asymptotic behavior of looking up a
commit in an incremental chain is not dominated by the number of
incrementals in that chain. It can be controlled by the '--max-commits'
and '--size-multiple' options.

In the next two commits, we will introduce additional splitting
strategies that can exert additional control over:

  - when a split commit-graph is and isn't written, and

  - when the existing commit-graph chain is discarded completely and
    replaced with another graph

To prepare for this, make '--split' take an optional strategy (as in
'--split[=<strategy>]'), and add a new enum to describe which strategy
is being used. For now, no strategies are given, and the only enumerated
value is 'COMMIT_GRAPH_SPLIT_UNSPECIFIED', indicating the absence of a
strategy.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-commit-graph.txt
builtin/commit-graph.c
commit-graph.h

index 28d1fee505306ba8d4b3aa1c9c6ac18522d4bd3b..10d757c5cc7843217c202e00fe76ccb4dba99f02 100644 (file)
@@ -57,11 +57,12 @@ or `--stdin-packs`.)
 With the `--append` option, include all commits that are present in the
 existing commit-graph file.
 +
-With the `--split` option, write the commit-graph as a chain of multiple
-commit-graph files stored in `<dir>/info/commit-graphs`. The new commits
-not already in the commit-graph are added in a new "tip" file. This file
-is merged with the existing file if the following merge conditions are
-met:
+With the `--split[=<strategy>]` option, write the commit-graph as a
+chain of multiple commit-graph files stored in
+`<dir>/info/commit-graphs`. Commit-graph layers are merged based on the
+strategy and other splitting options. The new commits not already in the
+commit-graph are added in a new "tip" file. This file is merged with the
+existing file if the following merge conditions are met:
 +
 * 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
index 4a70b33fb5f1359397742fcf8601c4c1d49109fe..345fd97c6124424fe229b22f60de49c8553a5340 100644 (file)
@@ -9,7 +9,9 @@
 
 static char const * const builtin_commit_graph_usage[] = {
        N_("git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]"),
-       N_("git commit-graph write [--object-dir <objdir>] [--append|--split] [--reachable|--stdin-packs|--stdin-commits] [--[no-]progress] <split options>"),
+       N_("git commit-graph write [--object-dir <objdir>] [--append] "
+          "[--split[=<strategy>]] [--reachable|--stdin-packs|--stdin-commits] "
+          "[--[no-]progress] <split options>"),
        NULL
 };
 
@@ -19,7 +21,9 @@ static const char * const builtin_commit_graph_verify_usage[] = {
 };
 
 static const char * const builtin_commit_graph_write_usage[] = {
-       N_("git commit-graph write [--object-dir <objdir>] [--append|--split] [--reachable|--stdin-packs|--stdin-commits] [--[no-]progress] <split options>"),
+       N_("git commit-graph write [--object-dir <objdir>] [--append] "
+          "[--split[=<strategy>]] [--reachable|--stdin-packs|--stdin-commits] "
+          "[--[no-]progress] <split options>"),
        NULL
 };
 
@@ -111,6 +115,18 @@ static int graph_verify(int argc, const char **argv)
 extern int read_replace_refs;
 static struct split_commit_graph_opts split_opts;
 
+static int write_option_parse_split(const struct option *opt, const char *arg,
+                                   int unset)
+{
+       opts.split = 1;
+       if (!arg)
+               return 0;
+
+       die(_("unrecognized --split argument, %s"), arg);
+
+       return 0;
+}
+
 static int graph_write(int argc, const char **argv)
 {
        struct string_list *pack_indexes = NULL;
@@ -133,8 +149,10 @@ static int graph_write(int argc, const char **argv)
                OPT_BOOL(0, "append", &opts.append,
                        N_("include all commits already in the commit-graph file")),
                OPT_BOOL(0, "progress", &opts.progress, N_("force progress reporting")),
-               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),
                OPT_INTEGER(0, "max-commits", &split_opts.max_commits,
                        N_("maximum number of commits in a non-base split commit-graph")),
                OPT_INTEGER(0, "size-multiple", &split_opts.size_multiple,
index e87a6f636000d68137fe3ec437b02e439a8171a5..e799008ff43799e27fbd5bcb3014b5436afa196e 100644 (file)
@@ -82,10 +82,15 @@ enum commit_graph_write_flags {
        COMMIT_GRAPH_WRITE_CHECK_OIDS = (1 << 3)
 };
 
+enum commit_graph_split_flags {
+       COMMIT_GRAPH_SPLIT_UNSPECIFIED = 0
+};
+
 struct split_commit_graph_opts {
        int size_multiple;
        int max_commits;
        timestamp_t expire_time;
+       enum commit_graph_split_flags flags;
 };
 
 /*