mirror of
https://github.com/git/git
synced 2024-08-27 19:49:21 +00:00
![Jeff King](/assets/img/avatar_default.png)
The previous commit added tests to show that index-pack correctly bails in unrecoverable situations. There are some situations where the data could be recovered, but it is not currently: 1. If we can break the cycle using an object from another pack via --fix-thin. 2. If we can break the cycle using a duplicate of one of the objects found in the same pack. Note that neither of these is particularly high priority; a delta cycle within a pack should never occur, and we have no record of even a buggy git implementation creating such a pack. However, it's worth adding these tests for two reasons. One, to document that we do not currently handle the situation, even though it is possible. And two, to exercise the code that runs in this situation; even though it fails, by running it we can confirm that index-pack detects the situation and aborts, and does not misbehave (e.g., by following the cycle in an infinite loop). In both cases, we hit an assert that aborts index-pack. Signed-off-by: Jeff King <peff@peff.net> Acked-by: Nicolas Pitre <nico@fluxnic.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
78 lines
1.7 KiB
Bash
Executable file
78 lines
1.7 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='test index-pack handling of delta cycles in packfiles'
|
|
. ./test-lib.sh
|
|
. "$TEST_DIRECTORY"/lib-pack.sh
|
|
|
|
# Two similar-ish objects that we have computed deltas between.
|
|
A=01d7713666f4de822776c7622c10f1b07de280dc
|
|
B=e68fe8129b546b101aee9510c5328e7f21ca1d18
|
|
|
|
# double-check our hand-constucted packs
|
|
test_expect_success 'index-pack works with a single delta (A->B)' '
|
|
clear_packs &&
|
|
{
|
|
pack_header 2 &&
|
|
pack_obj $A $B &&
|
|
pack_obj $B
|
|
} >ab.pack &&
|
|
pack_trailer ab.pack &&
|
|
git index-pack --stdin <ab.pack &&
|
|
git cat-file -t $A &&
|
|
git cat-file -t $B
|
|
'
|
|
|
|
test_expect_success 'index-pack works with a single delta (B->A)' '
|
|
clear_packs &&
|
|
{
|
|
pack_header 2 &&
|
|
pack_obj $A &&
|
|
pack_obj $B $A
|
|
} >ba.pack &&
|
|
pack_trailer ba.pack &&
|
|
git index-pack --stdin <ba.pack &&
|
|
git cat-file -t $A &&
|
|
git cat-file -t $B
|
|
'
|
|
|
|
test_expect_success 'index-pack detects missing base objects' '
|
|
clear_packs &&
|
|
{
|
|
pack_header 1 &&
|
|
pack_obj $A $B
|
|
} >missing.pack &&
|
|
pack_trailer missing.pack &&
|
|
test_must_fail git index-pack --fix-thin --stdin <missing.pack
|
|
'
|
|
|
|
test_expect_success 'index-pack detects REF_DELTA cycles' '
|
|
clear_packs &&
|
|
{
|
|
pack_header 2 &&
|
|
pack_obj $A $B &&
|
|
pack_obj $B $A
|
|
} >cycle.pack &&
|
|
pack_trailer cycle.pack &&
|
|
test_must_fail git index-pack --fix-thin --stdin <cycle.pack
|
|
'
|
|
|
|
test_expect_failure 'failover to an object in another pack' '
|
|
clear_packs &&
|
|
git index-pack --stdin <ab.pack &&
|
|
git index-pack --stdin --fix-thin <cycle.pack
|
|
'
|
|
|
|
test_expect_failure 'failover to a duplicate object in the same pack' '
|
|
clear_packs &&
|
|
{
|
|
pack_header 3 &&
|
|
pack_obj $A $B &&
|
|
pack_obj $B $A &&
|
|
pack_obj $A
|
|
} >recoverable.pack &&
|
|
pack_trailer recoverable.pack &&
|
|
git index-pack --fix-thin --stdin <recoverable.pack
|
|
'
|
|
|
|
test_done
|