]> git.ipfire.org Git - thirdparty/git.git/commitdiff
packfile: pass down repository to `for_each_packed_object`
authorKarthik Nayak <karthik.188@gmail.com>
Tue, 3 Dec 2024 14:44:00 +0000 (15:44 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 3 Dec 2024 23:21:54 +0000 (08:21 +0900)
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>
15 files changed:
builtin/cat-file.c
builtin/fsck.c
builtin/pack-objects.c
builtin/repack.c
builtin/rev-list.c
commit-graph.c
fsck.c
list-objects.c
object-store-ll.h
packfile.c
packfile.h
promisor-remote.c
reachable.c
revision.c
tag.c

index bfdfb51c7cb7b3cba47ae77b9041814fe9307407..d67b101c20c30c289f4c06447ddc560bdffe754a 100644 (file)
@@ -827,15 +827,16 @@ static int batch_objects(struct batch_options *opt)
                        cb.seen = &seen;
 
                        for_each_loose_object(batch_unordered_loose, &cb, 0);
-                       for_each_packed_object(batch_unordered_packed, &cb,
-                                              FOR_EACH_OBJECT_PACK_ORDER);
+                       for_each_packed_object(the_repository, batch_unordered_packed,
+                                              &cb, FOR_EACH_OBJECT_PACK_ORDER);
 
                        oidset_clear(&seen);
                } else {
                        struct oid_array sa = OID_ARRAY_INIT;
 
                        for_each_loose_object(collect_loose_object, &sa, 0);
-                       for_each_packed_object(collect_packed_object, &sa, 0);
+                       for_each_packed_object(the_repository, collect_packed_object,
+                                              &sa, 0);
 
                        oid_array_for_each_unique(&sa, batch_object_cb, &cb);
 
index bb56eb98acc7524deba5efdf4fe43718dffb828a..0196c54eb68ee54c22de72d64b3f31602594e50b 100644 (file)
@@ -150,7 +150,7 @@ static int mark_object(struct object *obj, enum object_type type,
                return 0;
        obj->flags |= REACHABLE;
 
-       if (is_promisor_object(&obj->oid))
+       if (is_promisor_object(the_repository, &obj->oid))
                /*
                 * Further recursion does not need to be performed on this
                 * 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)
         * do a full fsck
         */
        if (!(obj->flags & HAS_OBJ)) {
-               if (is_promisor_object(&obj->oid))
+               if (is_promisor_object(the_repository, &obj->oid))
                        return;
                if (has_object_pack(the_repository, &obj->oid))
                        return; /* it is in pack - forget about it */
@@ -391,7 +391,10 @@ static void check_connectivity(void)
                 * traversal.
                 */
                for_each_loose_object(mark_loose_unreachable_referents, NULL, 0);
-               for_each_packed_object(mark_packed_unreachable_referents, NULL, 0);
+               for_each_packed_object(the_repository,
+                                      mark_packed_unreachable_referents,
+                                      NULL,
+                                      0);
        }
 
        /* 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,
                                                     refname, timestamp);
                        obj->flags |= USED;
                        mark_object_reachable(obj);
-               } else if (!is_promisor_object(oid)) {
+               } else if (!is_promisor_object(the_repository, oid)) {
                        error(_("%s: invalid reflog entry %s"),
                              refname, oid_to_hex(oid));
                        errors_found |= ERROR_REACHABLE;
@@ -531,7 +534,7 @@ static int fsck_handle_ref(const char *refname, const char *referent UNUSED, con
 
        obj = parse_object(the_repository, oid);
        if (!obj) {
-               if (is_promisor_object(oid)) {
+               if (is_promisor_object(the_repository, oid)) {
                        /*
                         * Increment default_refs anyway, because this is a
                         * valid ref.
@@ -966,7 +969,8 @@ int cmd_fsck(int argc,
 
        if (connectivity_only) {
                for_each_loose_object(mark_loose_for_connectivity, NULL, 0);
-               for_each_packed_object(mark_packed_for_connectivity, NULL, 0);
+               for_each_packed_object(the_repository,
+                                      mark_packed_for_connectivity, NULL, 0);
        } else {
                prepare_alt_odb(the_repository);
                for (odb = the_repository->objects->odb; odb; odb = odb->next)
@@ -1011,7 +1015,7 @@ int cmd_fsck(int argc,
                                                           &oid);
 
                        if (!obj || !(obj->flags & HAS_OBJ)) {
-                               if (is_promisor_object(&oid))
+                               if (is_promisor_object(the_repository, &oid))
                                        continue;
                                error(_("%s: object missing"), oid_to_hex(&oid));
                                errors_found |= ERROR_OBJECT;
index 0f32e92a3a36d76212352a681b10fdc748b3438a..db20f0cf51aabd789c4e37c68e8426b8462d07c4 100644 (file)
@@ -3858,7 +3858,8 @@ static void show_object__ma_allow_promisor(struct object *obj, const char *name,
         * Quietly ignore EXPECTED missing objects.  This avoids problems with
         * staging them now and getting an odd error later.
         */
-       if (!has_object(the_repository, &obj->oid, 0) && is_promisor_object(&obj->oid))
+       if (!has_object(the_repository, &obj->oid, 0) &&
+           is_promisor_object(to_pack.repo, &obj->oid))
                return;
 
        show_object(obj, name, data);
@@ -3927,7 +3928,9 @@ static int add_object_in_unpacked_pack(const struct object_id *oid,
 
 static void add_objects_in_unpacked_packs(void)
 {
-       if (for_each_packed_object(add_object_in_unpacked_pack, NULL,
+       if (for_each_packed_object(to_pack.repo,
+                                  add_object_in_unpacked_pack,
+                                  NULL,
                                   FOR_EACH_OBJECT_PACK_ORDER |
                                   FOR_EACH_OBJECT_LOCAL_ONLY |
                                   FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS |
index d6bb37e84ae2e3715c48791b97f6798177629684..96a4fa234bddfd2b63c8d9733379d9b1012a4014 100644 (file)
@@ -404,7 +404,7 @@ static void repack_promisor_objects(const struct pack_objects_args *args,
         * {type -> existing pack order} ordering when computing deltas instead
         * of a {type -> size} ordering, which may produce better deltas.
         */
-       for_each_packed_object(write_oid, &cmd,
+       for_each_packed_object(the_repository, write_oid, &cmd,
                               FOR_EACH_OBJECT_PROMISOR_ONLY);
 
        if (cmd.in == -1) {
index f62bcbf2b140d1be87e0d03876e5ff94b17d7944..43c42621e3d72f5ed9ed0d50126cc1a626135198 100644 (file)
@@ -121,7 +121,7 @@ static inline void finish_object__ma(struct object *obj)
                return;
 
        case MA_ALLOW_PROMISOR:
-               if (is_promisor_object(&obj->oid))
+               if (is_promisor_object(the_repository, &obj->oid))
                        return;
                die("unexpected missing %s object '%s'",
                    type_name(obj->type), oid_to_hex(&obj->oid));
index 83dd69bfebc163015b847ae58e835627991b881b..e2e2083951cec6f42cb2be4cdd44bf4aeca43024 100644 (file)
@@ -1960,7 +1960,7 @@ static void fill_oids_from_all_packs(struct write_commit_graph_context *ctx)
                ctx->progress = start_delayed_progress(
                        _("Finding commits for commit graph among packed objects"),
                        ctx->approx_nr_objects);
-       for_each_packed_object(add_packed_commits, ctx,
+       for_each_packed_object(ctx->r, add_packed_commits, ctx,
                               FOR_EACH_OBJECT_PACK_ORDER);
        if (ctx->progress_done < ctx->approx_nr_objects)
                display_progress(ctx->progress, ctx->approx_nr_objects);
diff --git a/fsck.c b/fsck.c
index 3756f52459e7710e511adf1fe029526741e34137..87ce999a49c5480714553ffc990bb2be4688d94f 100644 (file)
--- a/fsck.c
+++ b/fsck.c
@@ -1295,7 +1295,7 @@ static int fsck_blobs(struct oidset *blobs_found, struct oidset *blobs_done,
 
                buf = repo_read_object_file(the_repository, oid, &type, &size);
                if (!buf) {
-                       if (is_promisor_object(oid))
+                       if (is_promisor_object(the_repository, oid))
                                continue;
                        ret |= report(options,
                                      oid, OBJ_BLOB, msg_missing,
index 31236a8dc918727747f6ab9b323cc3472b11156f..d11a389b3a0c86af8f8d82fa0587f9b3a0ee5232 100644 (file)
@@ -75,7 +75,7 @@ static void process_blob(struct traversal_context *ctx,
         */
        if (ctx->revs->exclude_promisor_objects &&
            !repo_has_object_file(the_repository, &obj->oid) &&
-           is_promisor_object(&obj->oid))
+           is_promisor_object(ctx->revs->repo, &obj->oid))
                return;
 
        pathlen = path->len;
@@ -180,7 +180,7 @@ static void process_tree(struct traversal_context *ctx,
                 * an incomplete list of missing objects.
                 */
                if (revs->exclude_promisor_objects &&
-                   is_promisor_object(&obj->oid))
+                   is_promisor_object(revs->repo, &obj->oid))
                        return;
 
                if (!revs->do_not_die_on_missing_objects)
index d46cd0e654501225e6235b4d6940aa727147ce9f..cd3bd5bd99f78cd01d914ac86fa94f0fb36853a3 100644 (file)
@@ -550,7 +550,7 @@ typedef int each_packed_object_fn(const struct object_id *oid,
 int for_each_object_in_pack(struct packed_git *p,
                            each_packed_object_fn, void *data,
                            enum for_each_object_flags flags);
-int for_each_packed_object(each_packed_object_fn, void *,
-                          enum for_each_object_flags flags);
+int for_each_packed_object(struct repository *repo, each_packed_object_fn cb,
+                          void *data, enum for_each_object_flags flags);
 
 #endif /* OBJECT_STORE_LL_H */
index e7dd2702174e87ddd7bd0442c68d861844b085f3..5e8019b1fe4c72abd77e3592ece48ff6c8b53fe3 100644 (file)
@@ -2200,15 +2200,15 @@ int for_each_object_in_pack(struct packed_git *p,
        return r;
 }
 
-int for_each_packed_object(each_packed_object_fn cb, void *data,
-                          enum for_each_object_flags flags)
+int for_each_packed_object(struct repository *repo, each_packed_object_fn cb,
+                          void *data, enum for_each_object_flags flags)
 {
        struct packed_git *p;
        int r = 0;
        int pack_errors = 0;
 
-       prepare_packed_git(the_repository);
-       for (p = get_all_packs(the_repository); p; p = p->next) {
+       prepare_packed_git(repo);
+       for (p = get_all_packs(repo); p; p = p->next) {
                if ((flags & FOR_EACH_OBJECT_LOCAL_ONLY) && !p->pack_local)
                        continue;
                if ((flags & FOR_EACH_OBJECT_PROMISOR_ONLY) &&
@@ -2286,14 +2286,14 @@ static int add_promisor_object(const struct object_id *oid,
        return 0;
 }
 
-int is_promisor_object(const struct object_id *oid)
+int is_promisor_object(struct repository *r, const struct object_id *oid)
 {
        static struct oidset promisor_objects;
        static int promisor_objects_prepared;
 
        if (!promisor_objects_prepared) {
-               if (repo_has_promisor_remote(the_repository)) {
-                       for_each_packed_object(add_promisor_object,
+               if (repo_has_promisor_remote(r)) {
+                       for_each_packed_object(r, add_promisor_object,
                                               &promisor_objects,
                                               FOR_EACH_OBJECT_PROMISOR_ONLY |
                                               FOR_EACH_OBJECT_PACK_ORDER);
index b09fb2c530a68d7f72683e1aa448dd433f9dcba3..addb95b0c44800dd2e0497afcdc3add15d57eef3 100644 (file)
@@ -201,7 +201,7 @@ int has_object_kept_pack(struct repository *r, const struct object_id *oid,
  * Return 1 if an object in a promisor packfile is or refers to the given
  * object, 0 otherwise.
  */
-int is_promisor_object(const struct object_id *oid);
+int is_promisor_object(struct repository *r, const struct object_id *oid);
 
 /*
  * Expose a function for fuzz testing.
index 9345ae3db235fbe8d850dfd6231ae605610c31e9..c714f4f00728e42524b26c78b5056d5feb258f43 100644 (file)
@@ -283,7 +283,7 @@ void promisor_remote_get_direct(struct repository *repo,
        }
 
        for (i = 0; i < remaining_nr; i++) {
-               if (is_promisor_object(&remaining_oids[i]))
+               if (is_promisor_object(repo, &remaining_oids[i]))
                        die(_("could not fetch %s from promisor remote"),
                            oid_to_hex(&remaining_oids[i]));
        }
index 09d2c5007994c86f8895f38ea56b61f55b3c2059..ecf7ccf5041a13a7bd5a2935d53dc678d1749b3a 100644 (file)
@@ -324,7 +324,7 @@ int add_unseen_recent_objects_to_traversal(struct rev_info *revs,
        if (ignore_in_core_kept_packs)
                flags |= FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS;
 
-       r = for_each_packed_object(add_recent_packed, &data, flags);
+       r = for_each_packed_object(revs->repo, add_recent_packed, &data, flags);
 
 done:
        oidset_clear(&data.extra_recent_oids);
index d1d152a67b830f4c3ddf9d321a06e1de76684834..45dc6d2819ac91bee6633151a908dd6d213578fb 100644 (file)
@@ -390,7 +390,8 @@ static struct object *get_reference(struct rev_info *revs, const char *name,
        if (!object) {
                if (revs->ignore_missing)
                        return NULL;
-               if (revs->exclude_promisor_objects && is_promisor_object(oid))
+               if (revs->exclude_promisor_objects &&
+                   is_promisor_object(revs->repo, oid))
                        return NULL;
                if (revs->do_not_die_on_missing_objects) {
                        oidset_insert(&revs->missing_commits, oid);
@@ -432,7 +433,7 @@ static struct commit *handle_commit(struct rev_info *revs,
                        if (revs->ignore_missing_links || (flags & UNINTERESTING))
                                return NULL;
                        if (revs->exclude_promisor_objects &&
-                           is_promisor_object(&tag->tagged->oid))
+                           is_promisor_object(revs->repo, &tag->tagged->oid))
                                return NULL;
                        if (revs->do_not_die_on_missing_objects && oid) {
                                oidset_insert(&revs->missing_commits, oid);
@@ -1211,7 +1212,7 @@ static int process_parents(struct rev_info *revs, struct commit *commit,
                             revs->do_not_die_on_missing_objects;
                if (repo_parse_commit_gently(revs->repo, p, gently) < 0) {
                        if (revs->exclude_promisor_objects &&
-                           is_promisor_object(&p->object.oid)) {
+                           is_promisor_object(revs->repo, &p->object.oid)) {
                                if (revs->first_parent_only)
                                        break;
                                continue;
@@ -3915,7 +3916,7 @@ int prepare_revision_walk(struct rev_info *revs)
                revs->treesame.name = "treesame";
 
        if (revs->exclude_promisor_objects) {
-               for_each_packed_object(mark_uninteresting, revs,
+               for_each_packed_object(revs->repo, mark_uninteresting, revs,
                                       FOR_EACH_OBJECT_PROMISOR_ONLY);
        }
 
diff --git a/tag.c b/tag.c
index d24170e34062f05f06f3f791f3e2a3a296dc5022..beef9571b5c1506c7ef42cc5943d71dc1cde458c 100644 (file)
--- a/tag.c
+++ b/tag.c
@@ -84,7 +84,7 @@ struct object *deref_tag(struct repository *r, struct object *o, const char *war
                        o = NULL;
                }
        if (!o && warn) {
-               if (last_oid && is_promisor_object(last_oid))
+               if (last_oid && is_promisor_object(r, last_oid))
                        return NULL;
                if (!warnlen)
                        warnlen = strlen(warn);