mirror of
https://github.com/git/git.git
synced 2024-05-09 03:16:13 +02:00
pack-revindex: make `load_pack_revindex` take a repository
In a future commit, we will introduce a `pack.readReverseIndex` configuration, which forces Git to generate the reverse index from scratch instead of loading it from disk. In order to avoid reading this configuration value more than once, we'll use the `repo_settings` struct to lazily load this value. In order to access the `struct repo_settings`, add a repository argument to `load_pack_revindex`, and update all callers to pass the correct instance (in all cases, `the_repository`). In certain instances, a new function-local variable is introduced to take the place of a `struct repository *` argument to the function itself to avoid propagating the new parameter even further throughout the tree. Co-authored-by: Derrick Stolee <derrickstolee@github.com> Signed-off-by: Derrick Stolee <derrickstolee@github.com> Signed-off-by: Taylor Blau <me@ttaylorr.com> Acked-by: Derrick Stolee <derrickstolee@github.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
b77919ed6e
commit
65308ad8f7
|
@ -463,7 +463,7 @@ static int open_pack_bitmap_1(struct bitmap_index *bitmap_git, struct packed_git
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int load_reverse_index(struct bitmap_index *bitmap_git)
|
static int load_reverse_index(struct repository *r, struct bitmap_index *bitmap_git)
|
||||||
{
|
{
|
||||||
if (bitmap_is_midx(bitmap_git)) {
|
if (bitmap_is_midx(bitmap_git)) {
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
@ -477,23 +477,23 @@ static int load_reverse_index(struct bitmap_index *bitmap_git)
|
||||||
* since we will need to make use of them in pack-objects.
|
* since we will need to make use of them in pack-objects.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < bitmap_git->midx->num_packs; i++) {
|
for (i = 0; i < bitmap_git->midx->num_packs; i++) {
|
||||||
ret = load_pack_revindex(bitmap_git->midx->packs[i]);
|
ret = load_pack_revindex(r, bitmap_git->midx->packs[i]);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return load_pack_revindex(bitmap_git->pack);
|
return load_pack_revindex(r, bitmap_git->pack);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int load_bitmap(struct bitmap_index *bitmap_git)
|
static int load_bitmap(struct repository *r, struct bitmap_index *bitmap_git)
|
||||||
{
|
{
|
||||||
assert(bitmap_git->map);
|
assert(bitmap_git->map);
|
||||||
|
|
||||||
bitmap_git->bitmaps = kh_init_oid_map();
|
bitmap_git->bitmaps = kh_init_oid_map();
|
||||||
bitmap_git->ext_index.positions = kh_init_oid_pos();
|
bitmap_git->ext_index.positions = kh_init_oid_pos();
|
||||||
|
|
||||||
if (load_reverse_index(bitmap_git))
|
if (load_reverse_index(r, bitmap_git))
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
||||||
if (!(bitmap_git->commits = read_bitmap_1(bitmap_git)) ||
|
if (!(bitmap_git->commits = read_bitmap_1(bitmap_git)) ||
|
||||||
|
@ -580,7 +580,7 @@ struct bitmap_index *prepare_bitmap_git(struct repository *r)
|
||||||
{
|
{
|
||||||
struct bitmap_index *bitmap_git = xcalloc(1, sizeof(*bitmap_git));
|
struct bitmap_index *bitmap_git = xcalloc(1, sizeof(*bitmap_git));
|
||||||
|
|
||||||
if (!open_bitmap(r, bitmap_git) && !load_bitmap(bitmap_git))
|
if (!open_bitmap(r, bitmap_git) && !load_bitmap(r, bitmap_git))
|
||||||
return bitmap_git;
|
return bitmap_git;
|
||||||
|
|
||||||
free_bitmap_index(bitmap_git);
|
free_bitmap_index(bitmap_git);
|
||||||
|
@ -589,9 +589,10 @@ struct bitmap_index *prepare_bitmap_git(struct repository *r)
|
||||||
|
|
||||||
struct bitmap_index *prepare_midx_bitmap_git(struct multi_pack_index *midx)
|
struct bitmap_index *prepare_midx_bitmap_git(struct multi_pack_index *midx)
|
||||||
{
|
{
|
||||||
|
struct repository *r = the_repository;
|
||||||
struct bitmap_index *bitmap_git = xcalloc(1, sizeof(*bitmap_git));
|
struct bitmap_index *bitmap_git = xcalloc(1, sizeof(*bitmap_git));
|
||||||
|
|
||||||
if (!open_midx_bitmap_1(bitmap_git, midx) && !load_bitmap(bitmap_git))
|
if (!open_midx_bitmap_1(bitmap_git, midx) && !load_bitmap(r, bitmap_git))
|
||||||
return bitmap_git;
|
return bitmap_git;
|
||||||
|
|
||||||
free_bitmap_index(bitmap_git);
|
free_bitmap_index(bitmap_git);
|
||||||
|
@ -1592,7 +1593,7 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs,
|
||||||
* from disk. this is the point of no return; after this the rev_list
|
* from disk. this is the point of no return; after this the rev_list
|
||||||
* becomes invalidated and we must perform the revwalk through bitmaps
|
* becomes invalidated and we must perform the revwalk through bitmaps
|
||||||
*/
|
*/
|
||||||
if (load_bitmap(bitmap_git) < 0)
|
if (load_bitmap(revs->repo, bitmap_git) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
object_array_clear(&revs->pending);
|
object_array_clear(&revs->pending);
|
||||||
|
@ -1742,6 +1743,7 @@ int reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
|
||||||
uint32_t *entries,
|
uint32_t *entries,
|
||||||
struct bitmap **reuse_out)
|
struct bitmap **reuse_out)
|
||||||
{
|
{
|
||||||
|
struct repository *r = the_repository;
|
||||||
struct packed_git *pack;
|
struct packed_git *pack;
|
||||||
struct bitmap *result = bitmap_git->result;
|
struct bitmap *result = bitmap_git->result;
|
||||||
struct bitmap *reuse;
|
struct bitmap *reuse;
|
||||||
|
@ -1752,7 +1754,7 @@ int reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
|
||||||
|
|
||||||
assert(result);
|
assert(result);
|
||||||
|
|
||||||
load_reverse_index(bitmap_git);
|
load_reverse_index(r, bitmap_git);
|
||||||
|
|
||||||
if (bitmap_is_midx(bitmap_git))
|
if (bitmap_is_midx(bitmap_git))
|
||||||
pack = bitmap_git->midx->packs[midx_preferred_pack(bitmap_git)];
|
pack = bitmap_git->midx->packs[midx_preferred_pack(bitmap_git)];
|
||||||
|
@ -2132,11 +2134,12 @@ int rebuild_bitmap(const uint32_t *reposition,
|
||||||
uint32_t *create_bitmap_mapping(struct bitmap_index *bitmap_git,
|
uint32_t *create_bitmap_mapping(struct bitmap_index *bitmap_git,
|
||||||
struct packing_data *mapping)
|
struct packing_data *mapping)
|
||||||
{
|
{
|
||||||
|
struct repository *r = the_repository;
|
||||||
uint32_t i, num_objects;
|
uint32_t i, num_objects;
|
||||||
uint32_t *reposition;
|
uint32_t *reposition;
|
||||||
|
|
||||||
if (!bitmap_is_midx(bitmap_git))
|
if (!bitmap_is_midx(bitmap_git))
|
||||||
load_reverse_index(bitmap_git);
|
load_reverse_index(r, bitmap_git);
|
||||||
else if (load_midx_revindex(bitmap_git->midx) < 0)
|
else if (load_midx_revindex(bitmap_git->midx) < 0)
|
||||||
BUG("rebuild_existing_bitmaps: missing required rev-cache "
|
BUG("rebuild_existing_bitmaps: missing required rev-cache "
|
||||||
"extension");
|
"extension");
|
||||||
|
|
|
@ -283,7 +283,7 @@ static int load_pack_revindex_from_disk(struct packed_git *p)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int load_pack_revindex(struct packed_git *p)
|
int load_pack_revindex(struct repository *r, struct packed_git *p)
|
||||||
{
|
{
|
||||||
if (p->revindex || p->revindex_data)
|
if (p->revindex || p->revindex_data)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -356,7 +356,7 @@ int offset_to_pack_pos(struct packed_git *p, off_t ofs, uint32_t *pos)
|
||||||
{
|
{
|
||||||
unsigned lo, hi;
|
unsigned lo, hi;
|
||||||
|
|
||||||
if (load_pack_revindex(p) < 0)
|
if (load_pack_revindex(the_repository, p) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
lo = 0;
|
lo = 0;
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
|
|
||||||
struct packed_git;
|
struct packed_git;
|
||||||
struct multi_pack_index;
|
struct multi_pack_index;
|
||||||
|
struct repository;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* load_pack_revindex populates the revindex's internal data-structures for the
|
* load_pack_revindex populates the revindex's internal data-structures for the
|
||||||
|
@ -47,7 +48,7 @@ struct multi_pack_index;
|
||||||
* If a '.rev' file is present it is mmap'd, and pointers are assigned into it
|
* If a '.rev' file is present it is mmap'd, and pointers are assigned into it
|
||||||
* (instead of using the in-memory variant).
|
* (instead of using the in-memory variant).
|
||||||
*/
|
*/
|
||||||
int load_pack_revindex(struct packed_git *p);
|
int load_pack_revindex(struct repository *r, struct packed_git *p);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* load_midx_revindex loads the '.rev' file corresponding to the given
|
* load_midx_revindex loads the '.rev' file corresponding to the given
|
||||||
|
|
|
@ -2151,7 +2151,7 @@ int for_each_object_in_pack(struct packed_git *p,
|
||||||
int r = 0;
|
int r = 0;
|
||||||
|
|
||||||
if (flags & FOR_EACH_OBJECT_PACK_ORDER) {
|
if (flags & FOR_EACH_OBJECT_PACK_ORDER) {
|
||||||
if (load_pack_revindex(p))
|
if (load_pack_revindex(the_repository, p))
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue