diff options
| -rw-r--r-- | midx.c | 19 | ||||
| -rw-r--r-- | midx.h | 3 | ||||
| -rw-r--r-- | odb.h | 9 | ||||
| -rw-r--r-- | packfile.c | 4 |
4 files changed, 24 insertions, 11 deletions
@@ -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)) @@ -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 @@ -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 @@ -56,6 +57,13 @@ struct odb_source { 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 * might be discarded on rollback. @@ -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); |
