mirror of
https://github.com/git/git
synced 2024-10-01 06:05:20 +00:00
Merge branch 'ps/missing-btmp-fix'
GIt 2.44 introduced a regression that makes the updated code to barf in repositories with multi-pack index written by older versions of Git, which has been corrected. * ps/missing-btmp-fix: pack-bitmap: gracefully handle missing BTMP chunks
This commit is contained in:
commit
567293123d
7
midx.c
7
midx.c
|
@ -170,9 +170,10 @@ struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local
|
|||
|
||||
pair_chunk(cf, MIDX_CHUNKID_LARGEOFFSETS, &m->chunk_large_offsets,
|
||||
&m->chunk_large_offsets_len);
|
||||
pair_chunk(cf, MIDX_CHUNKID_BITMAPPEDPACKS,
|
||||
(const unsigned char **)&m->chunk_bitmapped_packs,
|
||||
&m->chunk_bitmapped_packs_len);
|
||||
if (git_env_bool("GIT_TEST_MIDX_READ_BTMP", 1))
|
||||
pair_chunk(cf, MIDX_CHUNKID_BITMAPPEDPACKS,
|
||||
(const unsigned char **)&m->chunk_bitmapped_packs,
|
||||
&m->chunk_bitmapped_packs_len);
|
||||
|
||||
if (git_env_bool("GIT_TEST_MIDX_READ_RIDX", 1))
|
||||
pair_chunk(cf, MIDX_CHUNKID_REVINDEX, &m->chunk_revindex,
|
||||
|
|
|
@ -2049,7 +2049,10 @@ void reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
|
|||
|
||||
load_reverse_index(r, bitmap_git);
|
||||
|
||||
if (bitmap_is_midx(bitmap_git)) {
|
||||
if (!bitmap_is_midx(bitmap_git) || !bitmap_git->midx->chunk_bitmapped_packs)
|
||||
multi_pack_reuse = 0;
|
||||
|
||||
if (multi_pack_reuse) {
|
||||
for (i = 0; i < bitmap_git->midx->num_packs; i++) {
|
||||
struct bitmapped_pack pack;
|
||||
if (nth_bitmapped_pack(r, bitmap_git->midx, &pack, i) < 0) {
|
||||
|
@ -2062,34 +2065,32 @@ void reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
|
|||
if (!pack.bitmap_nr)
|
||||
continue;
|
||||
|
||||
if (!multi_pack_reuse && pack.bitmap_pos) {
|
||||
/*
|
||||
* If we're only reusing a single pack, skip
|
||||
* over any packs which are not positioned at
|
||||
* the beginning of the MIDX bitmap.
|
||||
*
|
||||
* This is consistent with the existing
|
||||
* single-pack reuse behavior, which only reuses
|
||||
* parts of the MIDX's preferred pack.
|
||||
*/
|
||||
continue;
|
||||
}
|
||||
|
||||
ALLOC_GROW(packs, packs_nr + 1, packs_alloc);
|
||||
memcpy(&packs[packs_nr++], &pack, sizeof(pack));
|
||||
|
||||
objects_nr += pack.p->num_objects;
|
||||
|
||||
if (!multi_pack_reuse)
|
||||
break;
|
||||
}
|
||||
|
||||
QSORT(packs, packs_nr, bitmapped_pack_cmp);
|
||||
} else {
|
||||
ALLOC_GROW(packs, packs_nr + 1, packs_alloc);
|
||||
struct packed_git *pack;
|
||||
|
||||
packs[packs_nr].p = bitmap_git->pack;
|
||||
packs[packs_nr].bitmap_nr = bitmap_git->pack->num_objects;
|
||||
if (bitmap_is_midx(bitmap_git)) {
|
||||
uint32_t preferred_pack_pos;
|
||||
|
||||
if (midx_preferred_pack(bitmap_git->midx, &preferred_pack_pos) < 0) {
|
||||
warning(_("unable to compute preferred pack, disabling pack-reuse"));
|
||||
return;
|
||||
}
|
||||
|
||||
pack = bitmap_git->midx->packs[preferred_pack_pos];
|
||||
} else {
|
||||
pack = bitmap_git->pack;
|
||||
}
|
||||
|
||||
ALLOC_GROW(packs, packs_nr + 1, packs_alloc);
|
||||
packs[packs_nr].p = pack;
|
||||
packs[packs_nr].bitmap_nr = pack->num_objects;
|
||||
packs[packs_nr].bitmap_pos = 0;
|
||||
|
||||
objects_nr = packs[packs_nr++].bitmap_nr;
|
||||
|
|
|
@ -513,4 +513,21 @@ test_expect_success 'corrupt MIDX with bitmap causes fallback' '
|
|||
)
|
||||
'
|
||||
|
||||
for allow_pack_reuse in single multi
|
||||
do
|
||||
test_expect_success "reading MIDX without BTMP chunk does not complain with $allow_pack_reuse pack reuse" '
|
||||
test_when_finished "rm -rf midx-without-btmp" &&
|
||||
git init midx-without-btmp &&
|
||||
(
|
||||
cd midx-without-btmp &&
|
||||
test_commit initial &&
|
||||
|
||||
git repack -Adbl --write-bitmap-index --write-midx &&
|
||||
GIT_TEST_MIDX_READ_BTMP=false git -c pack.allowPackReuse=$allow_pack_reuse \
|
||||
pack-objects --all --use-bitmap-index --stdout </dev/null >/dev/null 2>err &&
|
||||
test_must_be_empty err
|
||||
)
|
||||
'
|
||||
done
|
||||
|
||||
test_done
|
||||
|
|
Loading…
Reference in a new issue