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);