]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/repack.c: convert `--write-midx` to an `OPT_CALLBACK`
authorTaylor Blau <me@ttaylorr.com>
Tue, 19 May 2026 15:58:13 +0000 (11:58 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 20 May 2026 02:31:14 +0000 (11:31 +0900)
Change the --write-midx (-m) flag from an OPT_BOOL to an OPT_CALLBACK
that accepts an optional mode argument. Introduce an enum with
REPACK_WRITE_MIDX_NONE and REPACK_WRITE_MIDX_DEFAULT to distinguish
between the two states, and update all existing boolean checks
accordingly.

For now, passing no argument (or just `-m`) selects the default mode,
preserving existing behavior. A subsequent commit will add a new mode
for writing incremental MIDXs.

Extract repack_write_midx() as a dispatcher that selects the
appropriate MIDX-writing implementation based on the mode.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/repack.c
repack-midx.c
repack.h

index 24be147d39a1ed741d726f130e15d51114333639..5d366340c34b78ba0260f7b06831f83f240b7e69 100644 (file)
@@ -97,6 +97,24 @@ static int repack_config(const char *var, const char *value,
        return git_default_config(var, value, ctx, cb);
 }
 
+static int option_parse_write_midx(const struct option *opt, const char *arg,
+                                  int unset)
+{
+       enum repack_write_midx_mode *cfg = opt->value;
+
+       if (unset) {
+               *cfg = REPACK_WRITE_MIDX_NONE;
+               return 0;
+       }
+
+       if (!arg || !*arg)
+               *cfg = REPACK_WRITE_MIDX_DEFAULT;
+       else
+               return error(_("unknown value for %s: %s"), opt->long_name, arg);
+
+       return 0;
+}
+
 int cmd_repack(int argc,
               const char **argv,
               const char *prefix,
@@ -119,7 +137,7 @@ int cmd_repack(int argc,
        struct string_list keep_pack_list = STRING_LIST_INIT_NODUP;
        struct pack_objects_args po_args = PACK_OBJECTS_ARGS_INIT;
        struct pack_objects_args cruft_po_args = PACK_OBJECTS_ARGS_INIT;
-       int write_midx = 0;
+       enum repack_write_midx_mode write_midx = REPACK_WRITE_MIDX_NONE;
        const char *cruft_expiration = NULL;
        const char *expire_to = NULL;
        const char *filter_to = NULL;
@@ -185,8 +203,14 @@ int cmd_repack(int argc,
                                N_("do not repack this pack")),
                OPT_INTEGER('g', "geometric", &geometry.split_factor,
                            N_("find a geometric progression with factor <N>")),
-               OPT_BOOL('m', "write-midx", &write_midx,
-                          N_("write a multi-pack index of the resulting packs")),
+               OPT_CALLBACK_F(0, "write-midx", &write_midx,
+                          N_("mode"),
+                          N_("write a multi-pack index of the resulting packs"),
+                          PARSE_OPT_OPTARG, option_parse_write_midx),
+               OPT_SET_INT_F('m', NULL, &write_midx,
+                          N_("write a multi-pack index of the resulting packs"),
+                          REPACK_WRITE_MIDX_DEFAULT,
+                          PARSE_OPT_HIDDEN),
                OPT_STRING(0, "expire-to", &expire_to, N_("dir"),
                           N_("pack prefix to store a pack containing pruned objects")),
                OPT_STRING(0, "filter-to", &filter_to, N_("dir"),
@@ -221,14 +245,16 @@ int cmd_repack(int argc,
                pack_everything |= ALL_INTO_ONE;
 
        if (write_bitmaps < 0) {
-               if (!write_midx &&
+               if (write_midx == REPACK_WRITE_MIDX_NONE &&
                    (!(pack_everything & ALL_INTO_ONE) || !is_bare_repository()))
                        write_bitmaps = 0;
        }
        if (po_args.pack_kept_objects < 0)
-               po_args.pack_kept_objects = write_bitmaps > 0 && !write_midx;
+               po_args.pack_kept_objects = write_bitmaps > 0 &&
+                       write_midx == REPACK_WRITE_MIDX_NONE;
 
-       if (write_bitmaps && !(pack_everything & ALL_INTO_ONE) && !write_midx)
+       if (write_bitmaps && !(pack_everything & ALL_INTO_ONE) &&
+           write_midx == REPACK_WRITE_MIDX_NONE)
                die(_(incremental_bitmap_conflict_error));
 
        if (write_bitmaps && po_args.local &&
@@ -244,7 +270,7 @@ int cmd_repack(int argc,
                write_bitmaps = 0;
        }
 
-       if (write_midx && write_bitmaps) {
+       if (write_midx != REPACK_WRITE_MIDX_NONE && write_bitmaps) {
                struct strbuf path = STRBUF_INIT;
 
                strbuf_addf(&path, "%s/%s_XXXXXX",
@@ -297,7 +323,7 @@ int cmd_repack(int argc,
        }
        if (repo_has_promisor_remote(repo))
                strvec_push(&cmd.args, "--exclude-promisor-objects");
-       if (!write_midx) {
+       if (write_midx == REPACK_WRITE_MIDX_NONE) {
                if (write_bitmaps > 0)
                        strvec_push(&cmd.args, "--write-bitmap-index");
                else if (write_bitmaps < 0)
@@ -519,7 +545,7 @@ int cmd_repack(int argc,
        if (delete_redundant && pack_everything & ALL_INTO_ONE)
                existing_packs_mark_for_deletion(&existing, &names);
 
-       if (write_midx) {
+       if (write_midx != REPACK_WRITE_MIDX_NONE) {
                struct repack_write_midx_opts opts = {
                        .existing = &existing,
                        .geometry = &geometry,
@@ -528,11 +554,11 @@ int cmd_repack(int argc,
                        .packdir = packdir,
                        .show_progress = show_progress,
                        .write_bitmaps = write_bitmaps > 0,
-                       .midx_must_contain_cruft = midx_must_contain_cruft
+                       .midx_must_contain_cruft = midx_must_contain_cruft,
+                       .mode = write_midx,
                };
 
-               ret = write_midx_included_packs(&opts);
-
+               ret = repack_write_midx(&opts);
                if (ret)
                        goto cleanup;
        }
index 3fe83715da420f386addafa498a39db455efd25d..b1ca37970809a3b72bf02e808d21f26e1bdb82a8 100644 (file)
@@ -315,7 +315,7 @@ static int repack_fill_midx_stdin_packs(struct child_process *cmd,
        return finish_command(cmd);
 }
 
-int write_midx_included_packs(struct repack_write_midx_opts *opts)
+static int write_midx_included_packs(struct repack_write_midx_opts *opts)
 {
        struct child_process cmd = CHILD_PROCESS_INIT;
        struct string_list include = STRING_LIST_INIT_DUP;
@@ -378,3 +378,15 @@ done:
 
        return ret;
 }
+
+int repack_write_midx(struct repack_write_midx_opts *opts)
+{
+       switch (opts->mode) {
+       case REPACK_WRITE_MIDX_NONE:
+               BUG("write_midx mode is NONE?");
+       case REPACK_WRITE_MIDX_DEFAULT:
+               return write_midx_included_packs(opts);
+       default:
+               BUG("unhandled write_midx mode: %d", opts->mode);
+       }
+}
index 77d24ee45fb6aeee3af799cae9a7d5d77f090ef6..81907fcce7ff9405087e79c596cab4fa65bfe61e 100644 (file)
--- a/repack.h
+++ b/repack.h
@@ -134,6 +134,11 @@ void pack_geometry_release(struct pack_geometry *geometry);
 
 struct tempfile;
 
+enum repack_write_midx_mode {
+       REPACK_WRITE_MIDX_NONE,
+       REPACK_WRITE_MIDX_DEFAULT,
+};
+
 struct repack_write_midx_opts {
        struct existing_packs *existing;
        struct pack_geometry *geometry;
@@ -143,10 +148,11 @@ struct repack_write_midx_opts {
        int show_progress;
        int write_bitmaps;
        int midx_must_contain_cruft;
+       enum repack_write_midx_mode mode;
 };
 
 void midx_snapshot_refs(struct repository *repo, struct tempfile *f);
-int write_midx_included_packs(struct repack_write_midx_opts *opts);
+int repack_write_midx(struct repack_write_midx_opts *opts);
 
 int write_filtered_pack(const struct write_pack_opts *opts,
                        struct existing_packs *existing,