]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fsck: store repository in fsck options
authorPatrick Steinhardt <ps@pks.im>
Mon, 23 Mar 2026 15:02:54 +0000 (16:02 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 23 Mar 2026 15:33:10 +0000 (08:33 -0700)
The fsck subsystem relies on `the_repository` quite a bit. While we
could of course explicitly pass a repository down the callchain, we
already have a `struct fsck_options` that we pass to almost all
functions.

Extend the options to also store the repository to make it readily
available.

Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fsck.c
builtin/index-pack.c
builtin/mktag.c
builtin/refs.c
builtin/unpack-objects.c
fetch-pack.c
fsck.c
fsck.h
object-file.c

index 59e3b0f7ac28323e78bc356c7aefebd9ec996fdf..990d836918b84812cad7f0e8cea11dd3568cac0e 100644 (file)
@@ -243,7 +243,7 @@ static int mark_unreachable_referents(const struct object_id *oid,
                        object_as_type(obj, type, 0);
        }
 
-       fsck_options_init(&options, FSCK_OPTIONS_DEFAULT);
+       fsck_options_init(&options, the_repository, FSCK_OPTIONS_DEFAULT);
        options.walk = mark_used;
        fsck_walk(obj, NULL, &options);
        if (obj->type == OBJ_TREE)
@@ -987,7 +987,7 @@ static struct option fsck_opts[] = {
 int cmd_fsck(int argc,
             const char **argv,
             const char *prefix,
-            struct repository *repo UNUSED)
+            struct repository *repo)
 {
        struct odb_source *source;
        struct snapshot snap = {
@@ -1005,10 +1005,10 @@ int cmd_fsck(int argc,
 
        argc = parse_options(argc, argv, prefix, fsck_opts, fsck_usage, 0);
 
-       fsck_options_init(&fsck_walk_options, FSCK_OPTIONS_DEFAULT);
+       fsck_options_init(&fsck_walk_options, repo, FSCK_OPTIONS_DEFAULT);
        fsck_walk_options.walk = mark_object;
 
-       fsck_options_init(&fsck_obj_options, FSCK_OPTIONS_DEFAULT);
+       fsck_options_init(&fsck_obj_options, repo, FSCK_OPTIONS_DEFAULT);
        fsck_obj_options.walk = mark_used;
        fsck_obj_options.error_func = fsck_objects_error_func;
        if (check_strict)
index c8d28bcf8e2e1422756af57cb0346022e2853ec4..e4129bd605e89c0abdfba7a9c065c86a29586a9d 100644 (file)
@@ -1909,7 +1909,7 @@ int cmd_index_pack(int argc,
 
        disable_replace_refs();
 
-       fsck_options_init(&fsck_options, FSCK_OPTIONS_MISSING_GITMODULES);
+       fsck_options_init(&fsck_options, the_repository, FSCK_OPTIONS_MISSING_GITMODULES);
        fsck_options.walk = mark_link;
 
        reset_pack_idx_option(&opts);
index 9f37f9dede7a02c3dacb2c1c2c925bcdecbed884..f40264a87876f45c0dd8e38010e147cd7f026955 100644 (file)
@@ -75,7 +75,7 @@ static int verify_object_in_tag(struct object_id *tagged_oid, int *tagged_type)
 int cmd_mktag(int argc,
              const char **argv,
              const char *prefix,
-             struct repository *repo UNUSED)
+             struct repository *repo)
 {
        static struct option builtin_mktag_options[] = {
                OPT_BOOL(0, "strict", &option_strict,
@@ -94,7 +94,7 @@ int cmd_mktag(int argc,
        if (strbuf_read(&buf, 0, 0) < 0)
                die_errno(_("could not read from stdin"));
 
-       fsck_options_init(&fsck_options, FSCK_OPTIONS_STRICT);
+       fsck_options_init(&fsck_options, repo, FSCK_OPTIONS_STRICT);
        fsck_options.error_func = mktag_fsck_error_func;
        fsck_set_msg_type_from_ids(&fsck_options, FSCK_MSG_EXTRA_HEADER_ENTRY,
                                   FSCK_WARN);
index 1719ada54906877cd20355f626bae59804729255..e3125bc61b20e07a776e13ce1d4417bc860dbbfd 100644 (file)
@@ -78,7 +78,7 @@ out:
 }
 
 static int cmd_refs_verify(int argc, const char **argv, const char *prefix,
-                          struct repository *repo UNUSED)
+                          struct repository *repo)
 {
        struct fsck_options fsck_refs_options;
        struct worktree **worktrees;
@@ -93,7 +93,7 @@ static int cmd_refs_verify(int argc, const char **argv, const char *prefix,
        };
        int ret = 0;
 
-       fsck_options_init(&fsck_refs_options, FSCK_OPTIONS_REFS);
+       fsck_options_init(&fsck_refs_options, repo, FSCK_OPTIONS_REFS);
 
        argc = parse_options(argc, argv, prefix, options, verify_usage, 0);
        if (argc)
index 9e4bb9d25cf98a21bdebb6d73794b7220bad5782..d863912b24fae5cefede58c72e10714bda4ed789 100644 (file)
@@ -613,7 +613,7 @@ static void unpack_all(void)
 int cmd_unpack_objects(int argc,
                       const char **argv,
                       const char *prefix UNUSED,
-                      struct repository *repo UNUSED)
+                      struct repository *repo)
 {
        int i;
        struct object_id oid;
@@ -627,7 +627,7 @@ int cmd_unpack_objects(int argc,
 
        show_usage_if_asked(argc, argv, unpack_usage);
 
-       fsck_options_init(&fsck_options, FSCK_OPTIONS_STRICT);
+       fsck_options_init(&fsck_options, repo, FSCK_OPTIONS_STRICT);
 
        for (i = 1 ; i < argc; i++) {
                const char *arg = argv[i];
index 733916236897f3ea691b6ab09de8429530c5caeb..84a21c5107ba25122353938ea299c6f1bf107e0b 100644 (file)
@@ -1229,7 +1229,7 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
        } else
                alternate_shallow_file = NULL;
 
-       fsck_options_init(&fsck_options, FSCK_OPTIONS_MISSING_GITMODULES);
+       fsck_options_init(&fsck_options, the_repository, FSCK_OPTIONS_MISSING_GITMODULES);
        if (get_pack(args, fd, pack_lockfiles, NULL, sought, nr_sought,
                     &fsck_options.gitmodules_found))
                die(_("git fetch-pack: fetch failed."));
@@ -1675,7 +1675,7 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
        struct strvec index_pack_args = STRVEC_INIT;
        const char *promisor_remote_config;
 
-       fsck_options_init(&fsck_options, FSCK_OPTIONS_MISSING_GITMODULES);
+       fsck_options_init(&fsck_options, the_repository, FSCK_OPTIONS_MISSING_GITMODULES);
 
        if (server_feature_v2("promisor-remote", &promisor_remote_config))
                promisor_remote_reply(promisor_remote_config, NULL);
diff --git a/fsck.c b/fsck.c
index 1ff82085029661d5491edaae291089897dff7858..a05997703a5efb8a45c01f7bdb172b851b378448 100644 (file)
--- a/fsck.c
+++ b/fsck.c
@@ -1381,6 +1381,7 @@ bool fsck_has_queued_checks(struct fsck_options *options)
 }
 
 void fsck_options_init(struct fsck_options *options,
+                      struct repository *repo,
                       enum fsck_options_type type)
 {
        static const struct fsck_options defaults[] = {
@@ -1423,6 +1424,8 @@ void fsck_options_init(struct fsck_options *options,
        default:
                BUG("unknown fsck options type %d", type);
        }
+
+       options->repo = repo;
 }
 
 void fsck_options_clear(struct fsck_options *options)
diff --git a/fsck.h b/fsck.h
index 9c973b53b20cd4cfa14eb5475f72d3fa64032ea7..e77935c8a9ff6e831e87b5598497ea1982eb4047 100644 (file)
--- a/fsck.h
+++ b/fsck.h
@@ -166,7 +166,10 @@ struct fsck_ref_report {
        const char *path;
 };
 
+struct repository;
+
 struct fsck_options {
+       struct repository *repo;
        fsck_walk_func walk;
        fsck_error error_func;
        unsigned strict;
@@ -235,6 +238,7 @@ enum fsck_options_type {
 };
 
 void fsck_options_init(struct fsck_options *options,
+                      struct repository *repo,
                       enum fsck_options_type type);
 
 /*
index 186b2ff764a6648a16f0af24d3cf959ea98bd9f9..24ed5d55770de1e68803de46eb5636c4363d7774 100644 (file)
@@ -1281,7 +1281,7 @@ static int index_mem(struct index_state *istate,
        if (flags & INDEX_FORMAT_CHECK) {
                struct fsck_options opts;
 
-               fsck_options_init(&opts, FSCK_OPTIONS_DEFAULT);
+               fsck_options_init(&opts, the_repository, FSCK_OPTIONS_DEFAULT);
                opts.strict = 1;
                opts.error_func = hash_format_check_report;
                if (fsck_buffer(null_oid(istate->repo->hash_algo), type, buf, size, &opts))