midx: fix bug that skips midx with alternates
The logic for constructing the linked list of multi-pack-indexes in the object store is incorrect. If the local object store has a multi-pack-index, but an alternate does not, then the list is dropped. Add tests that would have revealed this bug. Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
fe86c3beb5
commit
29e2016b8f
11
midx.c
11
midx.c
@ -331,7 +331,7 @@ int midx_contains_pack(struct multi_pack_index *m, const char *idx_name)
|
||||
|
||||
int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, int local)
|
||||
{
|
||||
struct multi_pack_index *m = r->objects->multi_pack_index;
|
||||
struct multi_pack_index *m;
|
||||
struct multi_pack_index *m_search;
|
||||
int config_value;
|
||||
|
||||
@ -339,14 +339,15 @@ int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, i
|
||||
!config_value)
|
||||
return 0;
|
||||
|
||||
for (m_search = m; m_search; m_search = m_search->next)
|
||||
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;
|
||||
|
||||
r->objects->multi_pack_index = load_multi_pack_index(object_dir, local);
|
||||
m = load_multi_pack_index(object_dir, local);
|
||||
|
||||
if (r->objects->multi_pack_index) {
|
||||
r->objects->multi_pack_index->next = m;
|
||||
if (m) {
|
||||
m->next = r->objects->multi_pack_index;
|
||||
r->objects->multi_pack_index = m;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -149,6 +149,23 @@ test_expect_success 'repack removes multi-pack-index' '
|
||||
|
||||
compare_results_with_midx "after repack"
|
||||
|
||||
test_expect_success 'multi-pack-index and alternates' '
|
||||
git init --bare alt.git &&
|
||||
echo $(pwd)/alt.git/objects >.git/objects/info/alternates &&
|
||||
echo content1 >file1 &&
|
||||
altblob=$(GIT_DIR=alt.git git hash-object -w file1) &&
|
||||
git cat-file blob $altblob &&
|
||||
git rev-list --all
|
||||
'
|
||||
|
||||
compare_results_with_midx "with alternate (local midx)"
|
||||
|
||||
test_expect_success 'multi-pack-index in an alternate' '
|
||||
mv .git/objects/pack/* alt.git/objects/pack
|
||||
'
|
||||
|
||||
compare_results_with_midx "with alternate (remote midx)"
|
||||
|
||||
|
||||
# usage: corrupt_data <file> <pos> [<data>]
|
||||
corrupt_data () {
|
||||
|
Loading…
Reference in New Issue
Block a user