builtin/pack-objects: use `packfile_store_for_each_object()`

When enumerating objects that are supposed to be stored in a new cruft pack we use `for_each_packed_object()` and then derive each object's mtime individually. Refactor this logic to instead use the new `packfile_store_for_each_object()` function with an object info request that asks for the respective mtimes. 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 dd097bbe295d58fa698708d3754426f664fdfe02
1 file changed +22 -24
builtin/pack-objects.c
+22 -24
@@ -4314,25 +4314,12 @@ static void show_edge(struct commit *commit)
4314 }
4315
4316 static int add_object_in_unpacked_pack(const struct object_id *oid,
4317 - struct packed_git *pack,
4318 - uint32_t pos,
4317 + struct object_info *oi,
4318 void *data UNUSED)
4319 {
4320 if (cruft) {
4322 - off_t offset;
4323 - time_t mtime;
4324 -
4325 - if (pack->is_cruft) {
4326 - if (load_pack_mtimes(pack) < 0)
4327 - die(_("could not load cruft pack .mtimes"));
4328 - mtime = nth_packed_mtime(pack, pos);
4329 - } else {
4330 - mtime = pack->mtime;
4331 - }
4332 - offset = nth_packed_object_offset(pack, pos);
4333 -
4334 - add_cruft_object_entry(oid, OBJ_NONE, pack, offset,
4335 - NULL, mtime);
4321 + add_cruft_object_entry(oid, OBJ_NONE, oi->u.packed.pack,
4322 + oi->u.packed.offset, NULL, *oi->mtimep);
4323 } else {
4324 add_object_entry(oid, OBJ_NONE, "", 0);
4325 }
@@ -4341,14 +4328,25 @@ static int add_object_in_unpacked_pack(const struct object_id *oid,
4328
4329 static void add_objects_in_unpacked_packs(void)
4330 {
4344 - if (for_each_packed_object(to_pack.repo,
4345 - add_object_in_unpacked_pack,
4346 - NULL,
4347 - ODB_FOR_EACH_OBJECT_PACK_ORDER |
4348 - ODB_FOR_EACH_OBJECT_LOCAL_ONLY |
4349 - ODB_FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS |
4350 - ODB_FOR_EACH_OBJECT_SKIP_ON_DISK_KEPT_PACKS))
4351 - die(_("cannot open pack index"));
4331 + struct odb_source *source;
4332 + time_t mtime;
4333 + struct object_info oi = {
4334 + .mtimep = &mtime,
4335 + };
4336 +
4337 + odb_prepare_alternates(to_pack.repo->objects);
4338 + for (source = to_pack.repo->objects->sources; source; source = source->next) {
4339 + if (!source->local)
4340 + continue;
4341 +
4342 + if (packfile_store_for_each_object(source->packfiles, &oi,
4343 + add_object_in_unpacked_pack, NULL,
4344 + ODB_FOR_EACH_OBJECT_PACK_ORDER |
4345 + ODB_FOR_EACH_OBJECT_LOCAL_ONLY |
4346 + ODB_FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS |
4347 + ODB_FOR_EACH_OBJECT_SKIP_ON_DISK_KEPT_PACKS))
4348 + die(_("cannot open pack index"));
4349 + }
4350 }
4351
4352 static int add_loose_object(const struct object_id *oid, const char *path,