From ef25514fe6161e5971814e6e05a98d464ffcf501 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Tue, 9 Jun 2026 10:50:57 +0200 Subject: [PATCH] odb/source-packed: store pointer to "files" instead of generic source The `struct odb_source_packed` holds a pointer to its owning parent source. The way that Git is currently structured, this parent is always the "files" source. In subsequent commits we're going to detangle that so that the "packed" source doesn't have any owning parent source at all, which makes it usable as a completely standalone source. Detangling this mess is somewhat intricate though, and is made even more intricate because it's not always clear which kind of source one is holding at a specific point in time -- either the parent "files" source, or the child "packed" source. Make this relationship more explicit by storing a pointer to the "files" source instead of storing a pointer to a generic `struct odb_source`. This will help make subsequent steps a bit clearer. Note that this is a temporary step, only. At the end of this series we will have dropped the parent pointer completely. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- odb/source-files.c | 2 +- odb/source-packed.c | 4 ++-- odb/source-packed.h | 4 ++-- packfile.c | 12 ++++++------ 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/odb/source-files.c b/odb/source-files.c index 191562f316..e04525fb08 100644 --- a/odb/source-files.c +++ b/odb/source-files.c @@ -269,7 +269,7 @@ struct odb_source_files *odb_source_files_new(struct object_database *odb, CALLOC_ARRAY(files, 1); odb_source_init(&files->base, odb, ODB_SOURCE_FILES, path, local); files->loose = odb_source_loose_new(odb, path, local); - files->packed = odb_source_packed_new(&files->base); + files->packed = odb_source_packed_new(files); files->base.free = odb_source_files_free; files->base.close = odb_source_files_close; diff --git a/odb/source-packed.c b/odb/source-packed.c index 1e94b47ea0..12e785be48 100644 --- a/odb/source-packed.c +++ b/odb/source-packed.c @@ -1,11 +1,11 @@ #include "git-compat-util.h" #include "odb/source-packed.h" -struct odb_source_packed *odb_source_packed_new(struct odb_source *source) +struct odb_source_packed *odb_source_packed_new(struct odb_source_files *parent) { struct odb_source_packed *store; CALLOC_ARRAY(store, 1); - store->source = source; + store->files = parent; strmap_init(&store->packs_by_path); return store; } diff --git a/odb/source-packed.h b/odb/source-packed.h index 327be4ad65..3c2d229a17 100644 --- a/odb/source-packed.h +++ b/odb/source-packed.h @@ -9,7 +9,7 @@ * A store that manages packfiles for a given object database. */ struct odb_source_packed { - struct odb_source *source; + struct odb_source_files *files; /* * The list of packfiles in the order in which they have been most @@ -67,6 +67,6 @@ struct odb_source_packed { * Allocate and initialize a new empty packfile store for the given object * database source. */ -struct odb_source_packed *odb_source_packed_new(struct odb_source *source); +struct odb_source_packed *odb_source_packed_new(struct odb_source_files *parent); #endif diff --git a/packfile.c b/packfile.c index 99be5789ef..862a24ad49 100644 --- a/packfile.c +++ b/packfile.c @@ -802,7 +802,7 @@ struct packed_git *packfile_store_load_pack(struct odb_source_packed *store, p = strmap_get(&store->packs_by_path, key.buf); if (!p) { - p = add_packed_git(store->source->odb->repo, idx_path, + p = add_packed_git(store->files->base.odb->repo, idx_path, strlen(idx_path), local); if (p) packfile_store_add_pack(store, p); @@ -990,8 +990,8 @@ void packfile_store_prepare(struct odb_source_packed *store) if (store->initialized) return; - prepare_multi_pack_index_one(store->source); - prepare_packed_git_one(store->source); + prepare_multi_pack_index_one(&store->files->base); + prepare_packed_git_one(&store->files->base); sort_packs(&store->packs.head, sort_pack); for (struct packfile_list_entry *e = store->packs.head; e; e = e->next) @@ -1029,7 +1029,7 @@ int packfile_store_count_objects(struct odb_source_packed *store, unsigned long count = 0; int ret; - m = get_multi_pack_index(store->source); + m = get_multi_pack_index(&store->files->base); if (m) count += m->num_objects + m->num_objects_in_base; @@ -2450,7 +2450,7 @@ static int packfile_store_for_each_prefixed_object( store->skip_mru_updates = true; - m = get_multi_pack_index(store->source); + m = get_multi_pack_index(&store->files->base); if (m) { ret = for_each_prefixed_object_in_midx(store, m, opts, data); if (ret) @@ -2632,7 +2632,7 @@ int packfile_store_find_abbrev_len(struct odb_source_packed *store, struct packfile_list_entry *e; struct multi_pack_index *m; - m = get_multi_pack_index(store->source); + m = get_multi_pack_index(&store->files->base); if (m) find_abbrev_len_for_midx(m, oid, min_len, &min_len);