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;
}
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))
struct repository;
struct bitmapped_pack;
struct git_hash_algo;
+struct odb_source;
#define MIDX_SIGNATURE 0x4d494458 /* "MIDX" */
#define MIDX_VERSION 1
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
struct oidtree;
struct strbuf;
struct repository;
+struct multi_pack_index;
/*
* Compute the exact path an alternate is at and returns it. In case of
/* 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
};
struct packed_git;
-struct multi_pack_index;
struct cached_object_entry;
/*
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);
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);