From 8384cbcb4c737c6d1c6becb40e439c398e3624b4 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Fri, 9 Jan 2026 09:33:15 +0100 Subject: [PATCH] packfile: only prepare owning store in `packfile_store_prepare()` When calling `packfile_store_prepare()` we prepare not only the provided packfile store, but also all those of all other sources part of the same object database. This was required when the store was still sitting on the object database level. But now that it sits on the source level it's not anymore. Refactor the code so that we only prepare the single packfile store passed by the caller. Adapt callers accordingly. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- builtin/grep.c | 14 ++++++++------ packfile.c | 19 +++++-------------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/builtin/grep.c b/builtin/grep.c index 4855b871dd..5b8b87b1ac 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -1213,12 +1213,14 @@ int cmd_grep(int argc, */ if (recurse_submodules) repo_read_gitmodules(the_repository, 1); - /* - * Note: `packfile_store_prepare()` prepares stores from all - * sources. This will be fixed in a subsequent commit. - */ - if (startup_info->have_repository) - packfile_store_prepare(the_repository->objects->sources->packfiles); + + if (startup_info->have_repository) { + struct odb_source *source; + + odb_prepare_alternates(the_repository->objects); + for (source = the_repository->objects->sources; source; source = source->next) + packfile_store_prepare(source->packfiles); + } start_threads(&opt); } else { diff --git a/packfile.c b/packfile.c index c46d53b75d..23d8f7cb93 100644 --- a/packfile.c +++ b/packfile.c @@ -1063,16 +1063,11 @@ static int sort_pack(const struct packfile_list_entry *a, void packfile_store_prepare(struct packfile_store *store) { - struct odb_source *source; - if (store->initialized) return; - odb_prepare_alternates(store->source->odb); - for (source = store->source->odb->sources; source; source = source->next) { - prepare_multi_pack_index_one(source); - prepare_packed_git_one(source); - } + prepare_multi_pack_index_one(store->source); + prepare_packed_git_one(store->source); sort_packs(&store->packs.head, sort_pack); for (struct packfile_list_entry *e = store->packs.head; e; e = e->next) @@ -2098,15 +2093,11 @@ static int find_pack_entry(struct repository *r, { struct odb_source *source; - /* - * Note: `packfile_store_prepare()` prepares stores from all sources. - * This will be fixed in a subsequent commit. - */ - packfile_store_prepare(r->objects->sources->packfiles); - - for (source = r->objects->sources; source; source = source->next) + for (source = r->objects->sources; source; source = source->next) { + packfile_store_prepare(r->objects->sources->packfiles); if (source->midx && fill_midx_entry(source->midx, oid, e)) return 1; + } for (source = r->objects->sources; source; source = source->next) { struct packfile_list_entry *l;