Skip to content

Commit 23532be

Browse files
ttaylorrgitster
authored andcommitted
midx-write.c: tolerate --preferred-pack without bitmaps
When passing a preferred pack to the MIDX write machinery, we ensure that the given preferred pack is non-empty since 5d3cd09 (midx: reject empty `--preferred-pack`'s, 2021-08-31). However packs are only loaded (via `write_midx_internal()`, though a subsequent patch will refactor this code out to its own function) when the `MIDX_WRITE_REV_INDEX` flag is set. So if a caller runs: $ git multi-pack-index write --preferred-pack=... with both (a) an existing MIDX, and (b) specifies a pack from that MIDX as the preferred one, without passing `--bitmap`, then the check added in 5d3cd09 will result in a segfault. Note that packs loaded from disk which don't appear in an existing MIDX do not trigger this issue, as those packs are loaded unconditionally. We conditionally load packs from a MIDX since we tolerate MIDXs whose packs do not resolve (i.e., via the MIDX write after removing unreferenced packs via 'git multi-pack-index expire'). In practice, this isn't possible to trigger when running `git multi-pack-index write` from `git repack`, as the latter always passes `--stdin-packs`, which prevents us from loading an existing MIDX, as it forces all packs to be read from disk. But a future commit in this series will change that behavior to unconditionally load an existing MIDX, even with `--stdin-packs`, making this behavior trigger-able from 'repack' much more easily. Prevent this from being an issue by removing the segfault altogether by calling `prepare_midx_pack()` on packs loaded from an existing MIDX when either the `MIDX_WRITE_REV_INDEX` flag is set *or* we specified a `--preferred-pack`. Signed-off-by: Taylor Blau <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 3e4a232 commit 23532be

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

midx-write.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -929,11 +929,17 @@ static int write_midx_internal(const char *object_dir,
929929
for (i = 0; i < ctx.m->num_packs; i++) {
930930
ALLOC_GROW(ctx.info, ctx.nr + 1, ctx.alloc);
931931

932-
if (flags & MIDX_WRITE_REV_INDEX) {
932+
if (flags & MIDX_WRITE_REV_INDEX ||
933+
preferred_pack_name) {
933934
/*
934935
* If generating a reverse index, need to have
935936
* packed_git's loaded to compare their
936937
* mtimes and object count.
938+
*
939+
* If a preferred pack is specified,
940+
* need to have packed_git's loaded to
941+
* ensure the chosen preferred pack has
942+
* a non-zero object count.
937943
*/
938944
if (prepare_midx_pack(the_repository, ctx.m, i)) {
939945
error(_("could not load pack"));

t/t5319-multi-pack-index.sh

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,29 @@ test_expect_success 'preferred packs must be non-empty' '
350350
)
351351
'
352352

353+
test_expect_success 'preferred pack from existing MIDX without bitmaps' '
354+
git init preferred-without-bitmaps &&
355+
(
356+
cd preferred-without-bitmaps &&
357+
358+
test_commit one &&
359+
pack="$(git pack-objects --all $objdir/pack/pack </dev/null)" &&
360+
361+
git multi-pack-index write &&
362+
363+
# make another pack so that the subsequent MIDX write
364+
# has something to do
365+
test_commit two &&
366+
git repack -d &&
367+
368+
# write a new MIDX without bitmaps reusing the singular
369+
# pack from the existing MIDX as the preferred pack in
370+
# the new MIDX
371+
git multi-pack-index write --preferred-pack=pack-$pack.pack
372+
)
373+
374+
'
375+
353376
test_expect_success 'verify multi-pack-index success' '
354377
git multi-pack-index verify --object-dir=$objdir
355378
'

0 commit comments

Comments
 (0)