treewide: enumerate promisor objects via `odb_for_each_object()`

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>

Patrick Steinhardt committed Jan 26, 2026 at 10:51 UTC 2813c97310a998510ad4bcbbf38a774fd6bb5386
3 files changed +30 -25
packfile.c
+22 -15
@@ -2411,28 +2411,32 @@ int packfile_store_for_each_object(struct packfile_store *store,
2411 return pack_errors ? -1 : 0;
2412 }
2413
2414 +struct add_promisor_object_data {
2415 + struct repository *repo;
2416 + struct oidset *set;
2417 +};
2418 +
2419 static int add_promisor_object(const struct object_id *oid,
2415 - struct packed_git *pack,
2416 - uint32_t pos UNUSED,
2417 - void *set_)
2420 + struct object_info *oi UNUSED,
2421 + void *cb_data)
2422 {
2419 - struct oidset *set = set_;
2423 + struct add_promisor_object_data *data = cb_data;
2424 struct object *obj;
2425 int we_parsed_object;
2426
2423 - obj = lookup_object(pack->repo, oid);
2427 + obj = lookup_object(data->repo, oid);
2428 if (obj && obj->parsed) {
2429 we_parsed_object = 0;
2430 } else {
2431 we_parsed_object = 1;
2428 - obj = parse_object_with_flags(pack->repo, oid,
2432 + obj = parse_object_with_flags(data->repo, oid,
2433 PARSE_OBJECT_SKIP_HASH_CHECK);
2434 }
2435
2436 if (!obj)
2437 return 1;
2438
2435 - oidset_insert(set, oid);
2439 + oidset_insert(data->set, oid);
2440
2441 /*
2442 * If this is a tree, commit, or tag, the objects it refers
@@ -2450,19 +2454,19 @@ static int add_promisor_object(const struct object_id *oid,
2454 */
2455 return 0;
2456 while (tree_entry_gently(&desc, &entry))
2453 - oidset_insert(set, &entry.oid);
2457 + oidset_insert(data->set, &entry.oid);
2458 if (we_parsed_object)
2459 free_tree_buffer(tree);
2460 } else if (obj->type == OBJ_COMMIT) {
2461 struct commit *commit = (struct commit *) obj;
2462 struct commit_list *parents = commit->parents;
2463
2460 - oidset_insert(set, get_commit_tree_oid(commit));
2464 + oidset_insert(data->set, get_commit_tree_oid(commit));
2465 for (; parents; parents = parents->next)
2462 - oidset_insert(set, &parents->item->object.oid);
2466 + oidset_insert(data->set, &parents->item->object.oid);
2467 } else if (obj->type == OBJ_TAG) {
2468 struct tag *tag = (struct tag *) obj;
2465 - oidset_insert(set, get_tagged_oid(tag));
2469 + oidset_insert(data->set, get_tagged_oid(tag));
2470 }
2471 return 0;
2472 }
@@ -2474,10 +2478,13 @@ int is_promisor_object(struct repository *r, const struct object_id *oid)
2478
2479 if (!promisor_objects_prepared) {
2480 if (repo_has_promisor_remote(r)) {
2477 - for_each_packed_object(r, add_promisor_object,
2478 - &promisor_objects,
2479 - ODB_FOR_EACH_OBJECT_PROMISOR_ONLY |
2480 - ODB_FOR_EACH_OBJECT_PACK_ORDER);
2481 + struct add_promisor_object_data data = {
2482 + .repo = r,
2483 + .set = &promisor_objects,
2484 + };
2485 +
2486 + odb_for_each_object(r->objects, NULL, add_promisor_object, &data,
2487 + ODB_FOR_EACH_OBJECT_PROMISOR_ONLY | ODB_FOR_EACH_OBJECT_PACK_ORDER);
2488 }
2489 promisor_objects_prepared = 1;
2490 }
repack-promisor.c
+4 -4
@@ -17,8 +17,8 @@ struct write_oid_context {
17 * necessary.
18 */
19 static int write_oid(const struct object_id *oid,
20 - struct packed_git *pack UNUSED,
21 - uint32_t pos UNUSED, void *data)
20 + struct object_info *oi UNUSED,
21 + void *data)
22 {
23 struct write_oid_context *ctx = data;
24 struct child_process *cmd = ctx->cmd;
@@ -55,8 +55,8 @@ void repack_promisor_objects(struct repository *repo,
55 */
56 ctx.cmd = &cmd;
57 ctx.algop = repo->hash_algo;
58 - for_each_packed_object(repo, write_oid, &ctx,
59 - ODB_FOR_EACH_OBJECT_PROMISOR_ONLY);
58 + odb_for_each_object(repo->objects, NULL, write_oid, &ctx,
59 + ODB_FOR_EACH_OBJECT_PROMISOR_ONLY);
60
61 if (cmd.in == -1) {
62 /* No packed objects; cmd was never started */
revision.c
+4 -6
@@ -3626,8 +3626,7 @@ void reset_revision_walk(void)
3626 }
3627
3628 static int mark_uninteresting(const struct object_id *oid,
3629 - struct packed_git *pack UNUSED,
3630 - uint32_t pos UNUSED,
3629 + struct object_info *oi UNUSED,
3630 void *cb)
3631 {
3632 struct rev_info *revs = cb;
@@ -3936,10 +3935,9 @@ int prepare_revision_walk(struct rev_info *revs)
3935 (revs->limited && limiting_can_increase_treesame(revs)))
3936 revs->treesame.name = "treesame";
3937
3939 - if (revs->exclude_promisor_objects) {
3940 - for_each_packed_object(revs->repo, mark_uninteresting, revs,
3941 - ODB_FOR_EACH_OBJECT_PROMISOR_ONLY);
3942 - }
3938 + if (revs->exclude_promisor_objects)
3939 + odb_for_each_object(revs->repo->objects, NULL, mark_uninteresting,
3940 + revs, ODB_FOR_EACH_OBJECT_PROMISOR_ONLY);
3941
3942 if (!revs->reflog_info)
3943 prepare_to_use_bloom_filter(revs);