]> git.ipfire.org Git - thirdparty/git.git/commitdiff
treewide: enumerate promisor objects via `odb_for_each_object()`
authorPatrick Steinhardt <ps@pks.im>
Thu, 15 Jan 2026 11:04:38 +0000 (12:04 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 15 Jan 2026 13:50:28 +0000 (05:50 -0800)
We have multiple callsites where we enumerate all promisor objects in
the object database via `for_each_packed_object()`. This is done by
passing the `ODB_FOR_EACH_OBJECT_PROMISOR_ONLY` flag, which causes us to
skip over all non-promisor objects.

These callsites can be trivially converted to `odb_for_each_object()` as
we know to skip enumeration of loose objects in case the `PROMISOR_ONLY`
flag was passed by the caller.

Refactor the sites accordingly.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
packfile.c
repack-promisor.c
revision.c

index cd45c6f21c841d7870cc84f0579666376f3f10d9..4f84bc19d9fb6acf99ed52c9da76dbf029f8e60f 100644 (file)
@@ -2408,28 +2408,32 @@ int packfile_store_for_each_object(struct packfile_store *store,
        return pack_errors ? -1 : 0;
 }
 
+struct add_promisor_object_data {
+       struct repository *repo;
+       struct oidset *set;
+};
+
 static int add_promisor_object(const struct object_id *oid,
-                              struct packed_git *pack,
-                              uint32_t pos UNUSED,
-                              void *set_)
+                              struct object_info *oi UNUSED,
+                              void *cb_data)
 {
-       struct oidset *set = set_;
+       struct add_promisor_object_data *data = cb_data;
        struct object *obj;
        int we_parsed_object;
 
-       obj = lookup_object(pack->repo, oid);
+       obj = lookup_object(data->repo, oid);
        if (obj && obj->parsed) {
                we_parsed_object = 0;
        } else {
                we_parsed_object = 1;
-               obj = parse_object_with_flags(pack->repo, oid,
+               obj = parse_object_with_flags(data->repo, oid,
                                              PARSE_OBJECT_SKIP_HASH_CHECK);
        }
 
        if (!obj)
                return 1;
 
-       oidset_insert(set, oid);
+       oidset_insert(data->set, oid);
 
        /*
         * If this is a tree, commit, or tag, the objects it refers
@@ -2447,19 +2451,19 @@ static int add_promisor_object(const struct object_id *oid,
                         */
                        return 0;
                while (tree_entry_gently(&desc, &entry))
-                       oidset_insert(set, &entry.oid);
+                       oidset_insert(data->set, &entry.oid);
                if (we_parsed_object)
                        free_tree_buffer(tree);
        } else if (obj->type == OBJ_COMMIT) {
                struct commit *commit = (struct commit *) obj;
                struct commit_list *parents = commit->parents;
 
-               oidset_insert(set, get_commit_tree_oid(commit));
+               oidset_insert(data->set, get_commit_tree_oid(commit));
                for (; parents; parents = parents->next)
-                       oidset_insert(set, &parents->item->object.oid);
+                       oidset_insert(data->set, &parents->item->object.oid);
        } else if (obj->type == OBJ_TAG) {
                struct tag *tag = (struct tag *) obj;
-               oidset_insert(set, get_tagged_oid(tag));
+               oidset_insert(data->set, get_tagged_oid(tag));
        }
        return 0;
 }
@@ -2471,10 +2475,13 @@ int is_promisor_object(struct repository *r, const struct object_id *oid)
 
        if (!promisor_objects_prepared) {
                if (repo_has_promisor_remote(r)) {
-                       for_each_packed_object(r, add_promisor_object,
-                                              &promisor_objects,
-                                              ODB_FOR_EACH_OBJECT_PROMISOR_ONLY |
-                                              ODB_FOR_EACH_OBJECT_PACK_ORDER);
+                       struct add_promisor_object_data data = {
+                               .repo = r,
+                               .set = &promisor_objects,
+                       };
+
+                       odb_for_each_object(r->objects, NULL, add_promisor_object, &data,
+                                           ODB_FOR_EACH_OBJECT_PROMISOR_ONLY | ODB_FOR_EACH_OBJECT_PACK_ORDER);
                }
                promisor_objects_prepared = 1;
        }
index 45c330b9a53ae6d77b8cc362efbd03d6cdc678da..35c4073632b1b49cec04f1a71ff77ca7605fcd0a 100644 (file)
@@ -17,8 +17,8 @@ struct write_oid_context {
  * necessary.
  */
 static int write_oid(const struct object_id *oid,
-                    struct packed_git *pack UNUSED,
-                    uint32_t pos UNUSED, void *data)
+                    struct object_info *oi UNUSED,
+                    void *data)
 {
        struct write_oid_context *ctx = data;
        struct child_process *cmd = ctx->cmd;
@@ -55,8 +55,8 @@ void repack_promisor_objects(struct repository *repo,
         */
        ctx.cmd = &cmd;
        ctx.algop = repo->hash_algo;
-       for_each_packed_object(repo, write_oid, &ctx,
-                              ODB_FOR_EACH_OBJECT_PROMISOR_ONLY);
+       odb_for_each_object(repo->objects, NULL, write_oid, &ctx,
+                           ODB_FOR_EACH_OBJECT_PROMISOR_ONLY);
 
        if (cmd.in == -1) {
                /* No packed objects; cmd was never started */
index 5aadf46dac2b9d10c8428d6647c6bdb06b6710f7..e34bcd8e888127e9399a8d3d12ede338c39af8b1 100644 (file)
@@ -3626,8 +3626,7 @@ void reset_revision_walk(void)
 }
 
 static int mark_uninteresting(const struct object_id *oid,
-                             struct packed_git *pack UNUSED,
-                             uint32_t pos UNUSED,
+                             struct object_info *oi UNUSED,
                              void *cb)
 {
        struct rev_info *revs = cb;
@@ -3936,10 +3935,9 @@ int prepare_revision_walk(struct rev_info *revs)
            (revs->limited && limiting_can_increase_treesame(revs)))
                revs->treesame.name = "treesame";
 
-       if (revs->exclude_promisor_objects) {
-               for_each_packed_object(revs->repo, mark_uninteresting, revs,
-                                      ODB_FOR_EACH_OBJECT_PROMISOR_ONLY);
-       }
+       if (revs->exclude_promisor_objects)
+               odb_for_each_object(revs->repo->objects, NULL, mark_uninteresting,
+                                   revs, ODB_FOR_EACH_OBJECT_PROMISOR_ONLY);
 
        if (!revs->reflog_info)
                prepare_to_use_bloom_filter(revs);