packfile: pass down repository to `for_each_packed_object`

The function `for_each_packed_object` currently relies on the global variable `the_repository`. To eliminate global variable usage in `packfile.c`, we should progressively shift the dependency on the_repository to higher layers. Let's remove its usage from this function and closely related function `is_promisor_object`. Signed-off-by: Karthik Nayak <karthik.188@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Karthik Nayak committed Dec 3, 2024 at 15:44 UTC c87910b96b1223d4a1dfe65c04e03863fadef6bc
15 files changed +44 -35
builtin/cat-file.c
+4 -3
@@ -827,15 +827,16 @@ static int batch_objects(struct batch_options *opt)
827 cb.seen = &seen;
828
829 for_each_loose_object(batch_unordered_loose, &cb, 0);
830 - for_each_packed_object(batch_unordered_packed, &cb,
831 - FOR_EACH_OBJECT_PACK_ORDER);
830 + for_each_packed_object(the_repository, batch_unordered_packed,
831 + &cb, FOR_EACH_OBJECT_PACK_ORDER);
832
833 oidset_clear(&seen);
834 } else {
835 struct oid_array sa = OID_ARRAY_INIT;
836
837 for_each_loose_object(collect_loose_object, &sa, 0);
838 - for_each_packed_object(collect_packed_object, &sa, 0);
838 + for_each_packed_object(the_repository, collect_packed_object,
839 + &sa, 0);
840
841 oid_array_for_each_unique(&sa, batch_object_cb, &cb);
842
builtin/fsck.c
+11 -7
@@ -150,7 +150,7 @@ static int mark_object(struct object *obj, enum object_type type,
150 return 0;
151 obj->flags |= REACHABLE;
152
153 - if (is_promisor_object(&obj->oid))
153 + if (is_promisor_object(the_repository, &obj->oid))
154 /*
155 * Further recursion does not need to be performed on this
156 * object since it is a promisor object (so it does not need to
@@ -270,7 +270,7 @@ static void check_reachable_object(struct object *obj)
270 * do a full fsck
271 */
272 if (!(obj->flags & HAS_OBJ)) {
273 - if (is_promisor_object(&obj->oid))
273 + if (is_promisor_object(the_repository, &obj->oid))
274 return;
275 if (has_object_pack(the_repository, &obj->oid))
276 return; /* it is in pack - forget about it */
@@ -391,7 +391,10 @@ static void check_connectivity(void)
391 * traversal.
392 */
393 for_each_loose_object(mark_loose_unreachable_referents, NULL, 0);
394 - for_each_packed_object(mark_packed_unreachable_referents, NULL, 0);
394 + for_each_packed_object(the_repository,
395 + mark_packed_unreachable_referents,
396 + NULL,
397 + 0);
398 }
399
400 /* Look up all the requirements, warn about missing objects.. */
@@ -488,7 +491,7 @@ static void fsck_handle_reflog_oid(const char *refname, struct object_id *oid,
491 refname, timestamp);
492 obj->flags |= USED;
493 mark_object_reachable(obj);
491 - } else if (!is_promisor_object(oid)) {
494 + } else if (!is_promisor_object(the_repository, oid)) {
495 error(_("%s: invalid reflog entry %s"),
496 refname, oid_to_hex(oid));
497 errors_found |= ERROR_REACHABLE;
@@ -531,7 +534,7 @@ static int fsck_handle_ref(const char *refname, const char *referent UNUSED, con
534
535 obj = parse_object(the_repository, oid);
536 if (!obj) {
534 - if (is_promisor_object(oid)) {
537 + if (is_promisor_object(the_repository, oid)) {
538 /*
539 * Increment default_refs anyway, because this is a
540 * valid ref.
@@ -966,7 +969,8 @@ int cmd_fsck(int argc,
969
970 if (connectivity_only) {
971 for_each_loose_object(mark_loose_for_connectivity, NULL, 0);
969 - for_each_packed_object(mark_packed_for_connectivity, NULL, 0);
972 + for_each_packed_object(the_repository,
973 + mark_packed_for_connectivity, NULL, 0);
974 } else {
975 prepare_alt_odb(the_repository);
976 for (odb = the_repository->objects->odb; odb; odb = odb->next)
@@ -1011,7 +1015,7 @@ int cmd_fsck(int argc,
1015 &oid);
1016
1017 if (!obj || !(obj->flags & HAS_OBJ)) {
1014 - if (is_promisor_object(&oid))
1018 + if (is_promisor_object(the_repository, &oid))
1019 continue;
1020 error(_("%s: object missing"), oid_to_hex(&oid));
1021 errors_found |= ERROR_OBJECT;
builtin/pack-objects.c
+5 -2
@@ -3858,7 +3858,8 @@ static void show_object__ma_allow_promisor(struct object *obj, const char *name,
3858 * Quietly ignore EXPECTED missing objects. This avoids problems with
3859 * staging them now and getting an odd error later.
3860 */
3861 - if (!has_object(the_repository, &obj->oid, 0) && is_promisor_object(&obj->oid))
3861 + if (!has_object(the_repository, &obj->oid, 0) &&
3862 + is_promisor_object(to_pack.repo, &obj->oid))
3863 return;
3864
3865 show_object(obj, name, data);
@@ -3927,7 +3928,9 @@ static int add_object_in_unpacked_pack(const struct object_id *oid,
3928
3929 static void add_objects_in_unpacked_packs(void)
3930 {
3930 - if (for_each_packed_object(add_object_in_unpacked_pack, NULL,
3931 + if (for_each_packed_object(to_pack.repo,
3932 + add_object_in_unpacked_pack,
3933 + NULL,
3934 FOR_EACH_OBJECT_PACK_ORDER |
3935 FOR_EACH_OBJECT_LOCAL_ONLY |
3936 FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS |
builtin/repack.c
+1 -1
@@ -404,7 +404,7 @@ static void repack_promisor_objects(const struct pack_objects_args *args,
404 * {type -> existing pack order} ordering when computing deltas instead
405 * of a {type -> size} ordering, which may produce better deltas.
406 */
407 - for_each_packed_object(write_oid, &cmd,
407 + for_each_packed_object(the_repository, write_oid, &cmd,
408 FOR_EACH_OBJECT_PROMISOR_ONLY);
409
410 if (cmd.in == -1) {
builtin/rev-list.c
+1 -1
@@ -121,7 +121,7 @@ static inline void finish_object__ma(struct object *obj)
121 return;
122
123 case MA_ALLOW_PROMISOR:
124 - if (is_promisor_object(&obj->oid))
124 + if (is_promisor_object(the_repository, &obj->oid))
125 return;
126 die("unexpected missing %s object '%s'",
127 type_name(obj->type), oid_to_hex(&obj->oid));
commit-graph.c
+1 -1
@@ -1960,7 +1960,7 @@ static void fill_oids_from_all_packs(struct write_commit_graph_context *ctx)
1960 ctx->progress = start_delayed_progress(
1961 _("Finding commits for commit graph among packed objects"),
1962 ctx->approx_nr_objects);
1963 - for_each_packed_object(add_packed_commits, ctx,
1963 + for_each_packed_object(ctx->r, add_packed_commits, ctx,
1964 FOR_EACH_OBJECT_PACK_ORDER);
1965 if (ctx->progress_done < ctx->approx_nr_objects)
1966 display_progress(ctx->progress, ctx->approx_nr_objects);
fsck.c
+1 -1
@@ -1295,7 +1295,7 @@ static int fsck_blobs(struct oidset *blobs_found, struct oidset *blobs_done,
1295
1296 buf = repo_read_object_file(the_repository, oid, &type, &size);
1297 if (!buf) {
1298 - if (is_promisor_object(oid))
1298 + if (is_promisor_object(the_repository, oid))
1299 continue;
1300 ret |= report(options,
1301 oid, OBJ_BLOB, msg_missing,
list-objects.c
+2 -2
@@ -75,7 +75,7 @@ static void process_blob(struct traversal_context *ctx,
75 */
76 if (ctx->revs->exclude_promisor_objects &&
77 !repo_has_object_file(the_repository, &obj->oid) &&
78 - is_promisor_object(&obj->oid))
78 + is_promisor_object(ctx->revs->repo, &obj->oid))
79 return;
80
81 pathlen = path->len;
@@ -180,7 +180,7 @@ static void process_tree(struct traversal_context *ctx,
180 * an incomplete list of missing objects.
181 */
182 if (revs->exclude_promisor_objects &&
183 - is_promisor_object(&obj->oid))
183 + is_promisor_object(revs->repo, &obj->oid))
184 return;
185
186 if (!revs->do_not_die_on_missing_objects)
object-store-ll.h
+2 -2
@@ -550,7 +550,7 @@ typedef int each_packed_object_fn(const struct object_id *oid,
550 int for_each_object_in_pack(struct packed_git *p,
551 each_packed_object_fn, void *data,
552 enum for_each_object_flags flags);
553 -int for_each_packed_object(each_packed_object_fn, void *,
554 - enum for_each_object_flags flags);
553 +int for_each_packed_object(struct repository *repo, each_packed_object_fn cb,
554 + void *data, enum for_each_object_flags flags);
555
556 #endif /* OBJECT_STORE_LL_H */
packfile.c
+7 -7
@@ -2200,15 +2200,15 @@ int for_each_object_in_pack(struct packed_git *p,
2200 return r;
2201 }
2202
2203 -int for_each_packed_object(each_packed_object_fn cb, void *data,
2204 - enum for_each_object_flags flags)
2203 +int for_each_packed_object(struct repository *repo, each_packed_object_fn cb,
2204 + void *data, enum for_each_object_flags flags)
2205 {
2206 struct packed_git *p;
2207 int r = 0;
2208 int pack_errors = 0;
2209
2210 - prepare_packed_git(the_repository);
2211 - for (p = get_all_packs(the_repository); p; p = p->next) {
2210 + prepare_packed_git(repo);
2211 + for (p = get_all_packs(repo); p; p = p->next) {
2212 if ((flags & FOR_EACH_OBJECT_LOCAL_ONLY) && !p->pack_local)
2213 continue;
2214 if ((flags & FOR_EACH_OBJECT_PROMISOR_ONLY) &&
@@ -2286,14 +2286,14 @@ static int add_promisor_object(const struct object_id *oid,
2286 return 0;
2287 }
2288
2289 -int is_promisor_object(const struct object_id *oid)
2289 +int is_promisor_object(struct repository *r, const struct object_id *oid)
2290 {
2291 static struct oidset promisor_objects;
2292 static int promisor_objects_prepared;
2293
2294 if (!promisor_objects_prepared) {
2295 - if (repo_has_promisor_remote(the_repository)) {
2296 - for_each_packed_object(add_promisor_object,
2295 + if (repo_has_promisor_remote(r)) {
2296 + for_each_packed_object(r, add_promisor_object,
2297 &promisor_objects,
2298 FOR_EACH_OBJECT_PROMISOR_ONLY |
2299 FOR_EACH_OBJECT_PACK_ORDER);
packfile.h
+1 -1
@@ -201,7 +201,7 @@ int has_object_kept_pack(struct repository *r, const struct object_id *oid,
201 * Return 1 if an object in a promisor packfile is or refers to the given
202 * object, 0 otherwise.
203 */
204 -int is_promisor_object(const struct object_id *oid);
204 +int is_promisor_object(struct repository *r, const struct object_id *oid);
205
206 /*
207 * Expose a function for fuzz testing.
promisor-remote.c
+1 -1
@@ -283,7 +283,7 @@ void promisor_remote_get_direct(struct repository *repo,
283 }
284
285 for (i = 0; i < remaining_nr; i++) {
286 - if (is_promisor_object(&remaining_oids[i]))
286 + if (is_promisor_object(repo, &remaining_oids[i]))
287 die(_("could not fetch %s from promisor remote"),
288 oid_to_hex(&remaining_oids[i]));
289 }
reachable.c
+1 -1
@@ -324,7 +324,7 @@ int add_unseen_recent_objects_to_traversal(struct rev_info *revs,
324 if (ignore_in_core_kept_packs)
325 flags |= FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS;
326
327 - r = for_each_packed_object(add_recent_packed, &data, flags);
327 + r = for_each_packed_object(revs->repo, add_recent_packed, &data, flags);
328
329 done:
330 oidset_clear(&data.extra_recent_oids);
revision.c
+5 -4
@@ -390,7 +390,8 @@ static struct object *get_reference(struct rev_info *revs, const char *name,
390 if (!object) {
391 if (revs->ignore_missing)
392 return NULL;
393 - if (revs->exclude_promisor_objects && is_promisor_object(oid))
393 + if (revs->exclude_promisor_objects &&
394 + is_promisor_object(revs->repo, oid))
395 return NULL;
396 if (revs->do_not_die_on_missing_objects) {
397 oidset_insert(&revs->missing_commits, oid);
@@ -432,7 +433,7 @@ static struct commit *handle_commit(struct rev_info *revs,
433 if (revs->ignore_missing_links || (flags & UNINTERESTING))
434 return NULL;
435 if (revs->exclude_promisor_objects &&
435 - is_promisor_object(&tag->tagged->oid))
436 + is_promisor_object(revs->repo, &tag->tagged->oid))
437 return NULL;
438 if (revs->do_not_die_on_missing_objects && oid) {
439 oidset_insert(&revs->missing_commits, oid);
@@ -1211,7 +1212,7 @@ static int process_parents(struct rev_info *revs, struct commit *commit,
1212 revs->do_not_die_on_missing_objects;
1213 if (repo_parse_commit_gently(revs->repo, p, gently) < 0) {
1214 if (revs->exclude_promisor_objects &&
1214 - is_promisor_object(&p->object.oid)) {
1215 + is_promisor_object(revs->repo, &p->object.oid)) {
1216 if (revs->first_parent_only)
1217 break;
1218 continue;
@@ -3915,7 +3916,7 @@ int prepare_revision_walk(struct rev_info *revs)
3916 revs->treesame.name = "treesame";
3917
3918 if (revs->exclude_promisor_objects) {
3918 - for_each_packed_object(mark_uninteresting, revs,
3919 + for_each_packed_object(revs->repo, mark_uninteresting, revs,
3920 FOR_EACH_OBJECT_PROMISOR_ONLY);
3921 }
3922
tag.c
+1 -1
@@ -84,7 +84,7 @@ struct object *deref_tag(struct repository *r, struct object *o, const char *war
84 o = NULL;
85 }
86 if (!o && warn) {
87 - if (last_oid && is_promisor_object(last_oid))
87 + if (last_oid && is_promisor_object(r, last_oid))
88 return NULL;
89 if (!warnlen)
90 warnlen = strlen(warn);