t5309: create failing test for 'git index-pack'

This new test demonstrates some behavior where a valid packfile is being
rejected by the Git client due to the order in which it is resolving
REF_DELTAs.

The thin packfile has a REF_DELTA chain A->B->C where C is not included
in the packfile. However, the client repository contains both C and B
already. Thus, 'git index-pack' is able to resolve A before resolving B.

When resolving B, it then attempts to resolve any other REF_DELTAs that
are pointing to B as a base. This "revisits" A and complains as if there
is a cycle, but it did not actually detect a cycle.

A fix will arrive in the next change.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
seen
Derrick Stolee 2025-04-28 20:24:44 +00:00 committed by Junio C Hamano
parent 89d557b950
commit fd7fd7afc9
1 changed files with 24 additions and 0 deletions

View File

@ -75,4 +75,28 @@ test_expect_success 'failover to a duplicate object in the same pack' '
test_must_fail git index-pack --fix-thin --stdin <recoverable.pack
'

test_expect_failure 'index-pack works with thin pack A->B->C with B on disk' '
git init server &&
(
cd server &&
test_commit_bulk 4
) &&

A=$(git -C server rev-parse HEAD^{tree}) &&
B=$(git -C server rev-parse HEAD~1^{tree}) &&
C=$(git -C server rev-parse HEAD~2^{tree}) &&
git -C server reset --hard HEAD~1 &&

test-tool -C server pack-deltas --num-objects=2 >thin.pack <<-EOF &&
REF_DELTA $A $B
REF_DELTA $B $C
EOF

git clone "file://$(pwd)/server" client &&
(
cd client &&
git index-pack --fix-thin --stdin <../thin.pack
)
'

test_done