Skip to content

Commit 29e2016

Browse files
derrickstoleegitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent fe86c3b commit 29e2016

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed

midx.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -331,22 +331,23 @@ int midx_contains_pack(struct multi_pack_index *m, const char *idx_name)
331331

332332
int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, int local)
333333
{
334-
struct multi_pack_index *m = r->objects->multi_pack_index;
334+
struct multi_pack_index *m;
335335
struct multi_pack_index *m_search;
336336
int config_value;
337337

338338
if (repo_config_get_bool(r, "core.multipackindex", &config_value) ||
339339
!config_value)
340340
return 0;
341341

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)
343343
if (!strcmp(object_dir, m_search->object_dir))
344344
return 1;
345345

346-
r->objects->multi_pack_index = load_multi_pack_index(object_dir, local);
346+
m = load_multi_pack_index(object_dir, local);
347347

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;
350351
return 1;
351352
}
352353

t/t5319-multi-pack-index.sh

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,23 @@ test_expect_success 'repack removes multi-pack-index' '
149149

150150
compare_results_with_midx "after repack"
151151

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+
152169

153170
# usage: corrupt_data <file> <pos> [<data>]
154171
corrupt_data () {

0 commit comments

Comments
 (0)