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