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>

Derrick Stolee committed Aug 20, 2018 at 16:52 UTC 29e2016b8f952c900b2f4ce148be5279c53fd9e3
2 files changed +23 -5
midx.c
+6 -5
@@ -331,7 +331,7 @@ int midx_contains_pack(struct multi_pack_index *m, const char *idx_name)
331
332 int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, int local)
333 {
334 - struct multi_pack_index *m = r->objects->multi_pack_index;
334 + struct multi_pack_index *m;
335 struct multi_pack_index *m_search;
336 int config_value;
337
@@ -339,14 +339,15 @@ int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, i
339 !config_value)
340 return 0;
341
342 - for (m_search = m; m_search; m_search = m_search->next)
342 + for (m_search = r->objects->multi_pack_index; m_search; m_search = m_search->next)
343 if (!strcmp(object_dir, m_search->object_dir))
344 return 1;
345
346 - r->objects->multi_pack_index = load_multi_pack_index(object_dir, local);
346 + m = load_multi_pack_index(object_dir, local);
347
348 - if (r->objects->multi_pack_index) {
349 - r->objects->multi_pack_index->next = m;
348 + if (m) {
349 + m->next = r->objects->multi_pack_index;
350 + r->objects->multi_pack_index = m;
351 return 1;
352 }
353
t/t5319-multi-pack-index.sh
+17
@@ -149,6 +149,23 @@ test_expect_success 'repack removes multi-pack-index' '
149
150 compare_results_with_midx "after repack"
151
152 +test_expect_success 'multi-pack-index and alternates' '
153 + git init --bare alt.git &&
154 + echo $(pwd)/alt.git/objects >.git/objects/info/alternates &&
155 + echo content1 >file1 &&
156 + altblob=$(GIT_DIR=alt.git git hash-object -w file1) &&
157 + git cat-file blob $altblob &&
158 + git rev-list --all
159 +'
160 +
161 +compare_results_with_midx "with alternate (local midx)"
162 +
163 +test_expect_success 'multi-pack-index in an alternate' '
164 + mv .git/objects/pack/* alt.git/objects/pack
165 +'
166 +
167 +compare_results_with_midx "with alternate (remote midx)"
168 +
169
170 # usage: corrupt_data <file> <pos> [<data>]
171 corrupt_data () {