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>
maint
Derrick Stolee 2018-08-20 16:52:00 +00:00 committed by Junio C Hamano
parent fe86c3beb5
commit 29e2016b8f
2 changed files with 23 additions and 5 deletions

11
midx.c
View File

@ -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) 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; struct multi_pack_index *m_search;
int config_value; int config_value;


@ -339,14 +339,15 @@ int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, i
!config_value) !config_value)
return 0; 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)) if (!strcmp(object_dir, m_search->object_dir))
return 1; 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) { if (m) {
r->objects->multi_pack_index->next = m; m->next = r->objects->multi_pack_index;
r->objects->multi_pack_index = m;
return 1; return 1;
} }



View File

@ -149,6 +149,23 @@ test_expect_success 'repack removes multi-pack-index' '


compare_results_with_midx "after repack" 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>] # usage: corrupt_data <file> <pos> [<data>]
corrupt_data () { corrupt_data () {