diff --git a/midx.c b/midx.c index 3c5bc82173..2f64c26058 100644 --- a/midx.c +++ b/midx.c @@ -724,28 +724,29 @@ int midx_preferred_pack(struct multi_pack_index *m, uint32_t *pack_int_id) return 0; } -int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, int local) +int prepare_multi_pack_index_one(struct odb_source *source, int local) { + struct repository *r = source->odb->repo; struct multi_pack_index *m; - struct multi_pack_index *m_search; prepare_repo_settings(r); if (!r->settings.core_multi_pack_index) return 0; - for (m_search = r->objects->multi_pack_index; m_search; m_search = m_search->next) - if (!strcmp(object_dir, m_search->object_dir)) - return 1; - - m = load_multi_pack_index(r, object_dir, local); + if (source->midx) + return 1; + m = load_multi_pack_index(r, source->path, local); if (m) { struct multi_pack_index *mp = r->objects->multi_pack_index; if (mp) { m->next = mp->next; mp->next = m; - } else + } else { r->objects->multi_pack_index = m; + } + source->midx = m; + return 1; } @@ -837,6 +838,8 @@ void clear_midx_file(struct repository *r) if (r->objects && r->objects->multi_pack_index) { close_midx(r->objects->multi_pack_index); r->objects->multi_pack_index = NULL; + for (struct odb_source *source = r->objects->sources; source; source = source->next) + source->midx = NULL; } if (remove_path(midx.buf)) diff --git a/midx.h b/midx.h index 9d1374cbd5..639a6f50e4 100644 --- a/midx.h +++ b/midx.h @@ -8,6 +8,7 @@ struct pack_entry; struct repository; struct bitmapped_pack; struct git_hash_algo; +struct odb_source; #define MIDX_SIGNATURE 0x4d494458 /* "MIDX" */ #define MIDX_VERSION 1 @@ -123,7 +124,7 @@ int fill_midx_entry(struct repository *r, const struct object_id *oid, struct pa int midx_contains_pack(struct multi_pack_index *m, const char *idx_or_pack_name); int midx_preferred_pack(struct multi_pack_index *m, uint32_t *pack_int_id); -int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, int local); +int prepare_multi_pack_index_one(struct odb_source *source, int local); /* * Variant of write_midx_file which writes a MIDX containing only the packs diff --git a/odb.h b/odb.h index e922f25680..f09dba1fe1 100644 --- a/odb.h +++ b/odb.h @@ -13,6 +13,7 @@ struct oidmap; struct oidtree; struct strbuf; struct repository; +struct multi_pack_index; /* * Compute the exact path an alternate is at and returns it. In case of @@ -55,6 +56,13 @@ struct odb_source { /* Map between object IDs for loose objects. */ struct loose_object_map *loose_map; + /* + * private data + * + * should only be accessed directly by packfile.c and midx.c + */ + struct multi_pack_index *midx; + /* * This is a temporary object store created by the tmp_objdir * facility. Disable ref updates since the objects in the store @@ -75,7 +83,6 @@ struct odb_source { }; struct packed_git; -struct multi_pack_index; struct cached_object_entry; /* diff --git a/packfile.c b/packfile.c index af9ccfdba6..8bdd85fc7e 100644 --- a/packfile.c +++ b/packfile.c @@ -372,6 +372,8 @@ void close_object_store(struct object_database *o) if (o->multi_pack_index) { close_midx(o->multi_pack_index); o->multi_pack_index = NULL; + for (struct odb_source *source = o->sources; source; source = source->next) + source->midx = NULL; } close_commit_graph(o); @@ -1037,7 +1039,7 @@ static void prepare_packed_git(struct repository *r) odb_prepare_alternates(r->objects); for (source = r->objects->sources; source; source = source->next) { int local = (source == r->objects->sources); - prepare_multi_pack_index_one(r, source->path, local); + prepare_multi_pack_index_one(source, local); prepare_packed_git_one(r, source->path, local); } rearrange_packed_git(r);