diff options
| author | Derrick Stolee <stolee@gmail.com> | 2025-04-28 20:24:44 +0000 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2025-04-28 15:37:25 -0700 |
| commit | fd7fd7afc975a42dd60c96f57b83f2a4fc7e58c0 (patch) | |
| tree | 869cd0a78a0b4e5094b12a380d9ae2884ea78a4b | |
| parent | 89d557b950c7a0581c12452e8f9576c45546246b (diff) | |
| download | git-fd7fd7afc975a42dd60c96f57b83f2a4fc7e58c0.tar.xz | |
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>
| -rwxr-xr-x | t/t5309-pack-delta-cycles.sh | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/t/t5309-pack-delta-cycles.sh b/t/t5309-pack-delta-cycles.sh index 60fc710bac..6a93676330 100755 --- a/t/t5309-pack-delta-cycles.sh +++ b/t/t5309-pack-delta-cycles.sh @@ -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 |
