If a repo contains a multi-pack-index, then the packed_git list
does not contain the packfiles that are covered by the multi-pack-index.
This is important for doing object lookups, abbreviations, and
approximating object count. However, there are many operations that
really want to iterate over all packfiles.

Create a new 'all_packs' linked list that contains this list, starting
with the packfiles in the multi-pack-index and then continuing along
the packed_git linked list.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Derrick Stolee 2018-08-20 16:52:02 +00:00 коммит произвёл Junio C Hamano
Родитель 29e2016b8f
Коммит 0bff5269d3
5 изменённых файлов: 36 добавлений и 1 удалений

2
midx.c
Просмотреть файл

@ -197,7 +197,7 @@ static void close_midx(struct multi_pack_index *m)
FREE_AND_NULL(m->pack_names);
}
static int prepare_midx_pack(struct multi_pack_index *m, uint32_t pack_int_id)
int prepare_midx_pack(struct multi_pack_index *m, uint32_t pack_int_id)
{
struct strbuf pack_name = STRBUF_INIT;

1
midx.h
Просмотреть файл

@ -32,6 +32,7 @@ struct multi_pack_index {
};
struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local);
int prepare_midx_pack(struct multi_pack_index *m, uint32_t pack_int_id);
int bsearch_midx(const struct object_id *oid, struct multi_pack_index *m, uint32_t *result);
struct object_id *nth_midxed_object_oid(struct object_id *oid,
struct multi_pack_index *m,

Просмотреть файл

@ -129,6 +129,12 @@ struct raw_object_store {
/* A most-recently-used ordered version of the packed_git list. */
struct list_head packed_git_mru;
/*
* A linked list containing all packfiles, starting with those
* contained in the multi_pack_index.
*/
struct packed_git *all_packs;
/*
* A fast, rough count of the number of objects in the repository.
* These two fields are not meant for direct access. Use

Просмотреть файл

@ -972,6 +972,9 @@ static void prepare_packed_git(struct repository *r)
prepare_packed_git_one(r, alt->path, 0);
}
rearrange_packed_git(r);
r->objects->all_packs = NULL;
prepare_packed_git_mru(r);
r->objects->packed_git_initialized = 1;
}
@ -995,6 +998,30 @@ struct multi_pack_index *get_multi_pack_index(struct repository *r)
return r->objects->multi_pack_index;
}
struct packed_git *get_all_packs(struct repository *r)
{
prepare_packed_git(r);
if (!r->objects->all_packs) {
struct packed_git *p = r->objects->packed_git;
struct multi_pack_index *m;
for (m = r->objects->multi_pack_index; m; m = m->next) {
uint32_t i;
for (i = 0; i < m->num_packs; i++) {
if (!prepare_midx_pack(m, i)) {
m->packs[i]->next = p;
p = m->packs[i];
}
}
}
r->objects->all_packs = p;
}
return r->objects->all_packs;
}
struct list_head *get_packed_git_mru(struct repository *r)
{
prepare_packed_git(r);

Просмотреть файл

@ -51,6 +51,7 @@ extern void install_packed_git(struct repository *r, struct packed_git *pack);
struct packed_git *get_packed_git(struct repository *r);
struct list_head *get_packed_git_mru(struct repository *r);
struct multi_pack_index *get_multi_pack_index(struct repository *r);
struct packed_git *get_all_packs(struct repository *r);
/*
* Give a rough count of objects in the repository. This sacrifices accuracy