builtin/multi-pack-index: refuse unknown sources with "--object-dir="

Users can tell git-multi-pack-index(1) to access multi-pack indices that
are stored in a different object directory via the "--object-dir="
option. This allows them to for example write or verify a multi-pack
index other than the one located in the main object directory in case a
repository has alternates with multiple multi-pack indices.

But while the documentation explicitly points out that the specified
object directory must be an alternate of the current repository, we
never verify that property. Instead, starting with 017db7bb14 (midx:
load multi-pack indices via their source, 2025-08-11), we now construct
an ad-hoc source and link it to the main object directory.

Besides contradicting the documentation, it's dubious that this really
ought to work in the first place: creating a multi-pack index (and
potentially a bitmap) for a completely foreign object directory is of
questionable value, as bitmap commit selection operates on the invoking
repository's refs. Furthermore, this is the only remaining caller
outside of our test helpers that constructs an ad-hoc source and links
it to the database, and we want to get rid of this mechanism as part of
this series.

Stop constructing the ad-hoc source and instead refuse the operation.
While this results in a change in behaviour, this restriction has been
documented as such ever since f57a739691 (midx: avoid opening multiple
MIDXs when writing, 2021-09-01).

Note that this change requires us to adapt one test chain in t5319, as
it creates an object directory that is not connected to any repository
and then uses it via "--object-dir=". The setup itself already documents
this and does the necessary gymnastics to link the object directory to a
temporary repository, but subsequent tests don't. Adapt those tests to
retain and reuse the temporary repository.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
jch^2
Patrick Steinhardt 2026-09-01 13:09:08 +02:00 committed by Junio C Hamano
parent 6543910bad
commit d6cbbcd126
2 changed files with 6 additions and 6 deletions

View File

@ -90,7 +90,8 @@ static struct odb_source_files *handle_object_dir_option(struct repository *repo
{
struct odb_source *source = odb_find_source(repo->objects, opts.object_dir);
if (!source)
source = odb_add_to_alternates_memory(repo->objects, opts.object_dir);
die(_("object directory is not an alternate of the current repository: '%s'"),
opts.object_dir);
return odb_source_files_downcast(source);
}


View File

@ -698,10 +698,9 @@ test_expect_success 'force some 64-bit offsets with pack-objects' '
corrupt_data $idx64 $(test_oid idxoff) "\02" &&
# objects64 is not a real repository, but can serve as an alternate
# anyway so we can write a MIDX into it
git init repo &&
test_when_finished "rm -fr repo" &&
git init repo64 &&
(
cd repo &&
cd repo64 &&
( cd ../objects64 && pwd ) >.git/objects/info/alternates &&
midx64=$(git multi-pack-index --object-dir=../objects64 write)
) &&
@ -709,7 +708,7 @@ test_expect_success 'force some 64-bit offsets with pack-objects' '
'

test_expect_success 'verify multi-pack-index with 64-bit offsets' '
git multi-pack-index verify --object-dir=objects64
git -C repo64 multi-pack-index verify --object-dir=../objects64
'

NUM_OBJECTS=63
@ -721,7 +720,7 @@ MIDX_BYTE_LARGE_OFFSET=$(($MIDX_OFFSET_LARGE_OFFSETS + 3))

test_expect_success 'verify incorrect 64-bit offset' '
corrupt_midx_and_verify $MIDX_BYTE_LARGE_OFFSET "\07" objects64 \
"incorrect object offset"
"incorrect object offset" "git -C repo64 multi-pack-index verify --object-dir=../objects64"
'

test_expect_success 'setup expire tests' '