builtin/fsck: stop using `the_repository` when marking objects

We implicitly rely on `the_repository` when marking objects for connectivity. Refactor this to instead inject the repository via the callback payload. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Mar 23, 2026 at 16:03 UTC cc050f00cd969a72fcdad34e2308c7b19c1e68e6
1 file changed +14 -12
builtin/fsck.c
+14 -12
@@ -124,7 +124,7 @@ static int fsck_objects_error_func(struct fsck_options *o UNUSED,
124 static struct object_array pending;
125
126 static int mark_object(struct object *obj, enum object_type type,
127 - void *data, struct fsck_options *options UNUSED)
127 + void *data, struct fsck_options *options)
128 {
129 struct object *parent = data;
130
@@ -153,7 +153,7 @@ static int mark_object(struct object *obj, enum object_type type,
153 return 0;
154 obj->flags |= REACHABLE;
155
156 - if (is_promisor_object(the_repository, &obj->oid))
156 + if (is_promisor_object(options->repo, &obj->oid))
157 /*
158 * Further recursion does not need to be performed on this
159 * object since it is a promisor object (so it does not need to
@@ -162,7 +162,7 @@ static int mark_object(struct object *obj, enum object_type type,
162 return 0;
163
164 if (!(obj->flags & HAS_OBJ)) {
165 - if (parent && !odb_has_object(the_repository->objects, &obj->oid,
165 + if (parent && !odb_has_object(options->repo->objects, &obj->oid,
166 HAS_OBJECT_RECHECK_PACKED)) {
167 printf_ln(_("broken link from %7s %s\n"
168 " to %7s %s"),
@@ -181,7 +181,7 @@ static int mark_object(struct object *obj, enum object_type type,
181
182 static void mark_object_reachable(struct object *obj)
183 {
184 - mark_object(obj, OBJ_ANY, NULL, NULL);
184 + mark_object(obj, OBJ_ANY, NULL, &fsck_walk_options);
185 }
186
187 static int traverse_one_object(struct object *obj)
@@ -222,10 +222,11 @@ static int mark_used(struct object *obj, enum object_type type UNUSED,
222
223 static int mark_unreachable_referents(const struct object_id *oid,
224 struct object_info *oi UNUSED,
225 - void *data UNUSED)
225 + void *data)
226 {
227 + struct repository *repo = data;
228 struct fsck_options options;
228 - struct object *obj = lookup_object(the_repository, oid);
229 + struct object *obj = lookup_object(data, oid);
230
231 if (!obj || !(obj->flags & HAS_OBJ))
232 return 0; /* not part of our original set */
@@ -237,13 +238,13 @@ static int mark_unreachable_referents(const struct object_id *oid,
238 * (and we want to avoid parsing blobs).
239 */
240 if (obj->type == OBJ_NONE) {
240 - enum object_type type = odb_read_object_info(the_repository->objects,
241 + enum object_type type = odb_read_object_info(repo->objects,
242 &obj->oid, NULL);
243 if (type > 0)
244 object_as_type(obj, type, 0);
245 }
246
246 - fsck_options_init(&options, the_repository, FSCK_OPTIONS_DEFAULT);
247 + fsck_options_init(&options, repo, FSCK_OPTIONS_DEFAULT);
248 options.walk = mark_used;
249 fsck_walk(obj, NULL, &options);
250 if (obj->type == OBJ_TREE)
@@ -385,7 +386,7 @@ static void check_connectivity(struct repository *repo)
386 * traversal.
387 */
388 odb_for_each_object(repo->objects, NULL,
388 - mark_unreachable_referents, NULL, 0);
389 + mark_unreachable_referents, repo, 0);
390 }
391
392 /* Look up all the requirements, warn about missing objects.. */
@@ -909,9 +910,10 @@ static void fsck_index(struct index_state *istate, const char *index_path,
910
911 static int mark_object_for_connectivity(const struct object_id *oid,
912 struct object_info *oi UNUSED,
912 - void *cb_data UNUSED)
913 + void *cb_data)
914 {
914 - struct object *obj = lookup_unknown_object(the_repository, oid);
915 + struct repository *repo = cb_data;
916 + struct object *obj = lookup_unknown_object(repo, oid);
917 obj->flags |= HAS_OBJ;
918 return 0;
919 }
@@ -1065,7 +1067,7 @@ int cmd_fsck(int argc,
1067
1068 if (connectivity_only) {
1069 odb_for_each_object(repo->objects, NULL,
1068 - mark_object_for_connectivity, NULL, 0);
1070 + mark_object_for_connectivity, repo, 0);
1071 } else {
1072 odb_prepare_alternates(repo->objects);
1073 for (source = repo->objects->sources; source; source = source->next)