You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
208 lines
5.1 KiB
208 lines
5.1 KiB
#!/bin/sh |
|
|
|
test_description='on-disk reverse index' |
|
|
|
TEST_PASSES_SANITIZE_LEAK=true |
|
. ./test-lib.sh |
|
|
|
# The below tests want control over the 'pack.writeReverseIndex' setting |
|
# themselves to assert various combinations of it with other options. |
|
sane_unset GIT_TEST_NO_WRITE_REV_INDEX |
|
|
|
packdir=.git/objects/pack |
|
|
|
test_expect_success 'setup' ' |
|
test_commit base && |
|
|
|
test_config pack.writeReverseIndex false && |
|
pack=$(git pack-objects --all $packdir/pack) && |
|
rev=$packdir/pack-$pack.rev && |
|
|
|
test_path_is_missing $rev |
|
' |
|
|
|
test_index_pack () { |
|
rm -f $rev && |
|
conf=$1 && |
|
shift && |
|
# remove the index since Windows won't overwrite an existing file |
|
rm $packdir/pack-$pack.idx && |
|
git -c pack.writeReverseIndex=$conf index-pack "$@" \ |
|
$packdir/pack-$pack.pack |
|
} |
|
|
|
test_expect_success 'index-pack with pack.writeReverseIndex' ' |
|
test_index_pack "" && |
|
test_path_is_missing $rev && |
|
|
|
test_index_pack false && |
|
test_path_is_missing $rev && |
|
|
|
test_index_pack true && |
|
test_path_is_file $rev |
|
' |
|
|
|
test_expect_success 'index-pack with --[no-]rev-index' ' |
|
for conf in "" true false |
|
do |
|
test_index_pack "$conf" --rev-index && |
|
test_path_exists $rev && |
|
|
|
test_index_pack "$conf" --no-rev-index && |
|
test_path_is_missing $rev || return 1 |
|
done |
|
' |
|
|
|
test_expect_success 'index-pack can verify reverse indexes' ' |
|
test_when_finished "rm -f $rev" && |
|
test_index_pack true && |
|
|
|
test_path_is_file $rev && |
|
git index-pack --rev-index --verify $packdir/pack-$pack.pack && |
|
|
|
# Intentionally corrupt the reverse index. |
|
chmod u+w $rev && |
|
printf "xxxx" | dd of=$rev bs=1 count=4 conv=notrunc && |
|
|
|
test_must_fail git index-pack --rev-index --verify \ |
|
$packdir/pack-$pack.pack 2>err && |
|
grep "validation error" err |
|
' |
|
|
|
test_expect_success 'index-pack infers reverse index name with -o' ' |
|
git index-pack --rev-index -o other.idx $packdir/pack-$pack.pack && |
|
test_path_is_file other.idx && |
|
test_path_is_file other.rev |
|
' |
|
|
|
test_expect_success 'pack-objects respects pack.writeReverseIndex' ' |
|
test_when_finished "rm -fr pack-1-*" && |
|
|
|
git -c pack.writeReverseIndex= pack-objects --all pack-1 && |
|
test_path_is_missing pack-1-*.rev && |
|
|
|
git -c pack.writeReverseIndex=false pack-objects --all pack-1 && |
|
test_path_is_missing pack-1-*.rev && |
|
|
|
git -c pack.writeReverseIndex=true pack-objects --all pack-1 && |
|
test_path_is_file pack-1-*.rev |
|
' |
|
|
|
test_expect_success 'reverse index is not generated when available on disk' ' |
|
test_index_pack true && |
|
test_path_is_file $rev && |
|
|
|
git rev-parse HEAD >tip && |
|
GIT_TEST_REV_INDEX_DIE_IN_MEMORY=1 git cat-file \ |
|
--batch-check="%(objectsize:disk)" <tip |
|
' |
|
|
|
test_expect_success 'reverse index is ignored when pack.readReverseIndex is false' ' |
|
test_index_pack true && |
|
test_path_is_file $rev && |
|
|
|
test_config pack.readReverseIndex false && |
|
|
|
git rev-parse HEAD >tip && |
|
GIT_TEST_REV_INDEX_DIE_ON_DISK=1 git cat-file \ |
|
--batch-check="%(objectsize:disk)" <tip |
|
' |
|
|
|
test_expect_success 'revindex in-memory vs on-disk' ' |
|
git init repo && |
|
test_when_finished "rm -fr repo" && |
|
( |
|
cd repo && |
|
|
|
test_commit commit && |
|
|
|
git rev-list --objects --no-object-names --all >objects && |
|
|
|
git -c pack.writeReverseIndex=false repack -ad && |
|
test_path_is_missing $packdir/pack-*.rev && |
|
git cat-file --batch-check="%(objectsize:disk) %(objectname)" \ |
|
<objects >in-core && |
|
|
|
git -c pack.writeReverseIndex=true repack -ad && |
|
test_path_is_file $packdir/pack-*.rev && |
|
git cat-file --batch-check="%(objectsize:disk) %(objectname)" \ |
|
<objects >on-disk && |
|
|
|
test_cmp on-disk in-core |
|
) |
|
' |
|
|
|
test_expect_success 'fsck succeeds on good rev-index' ' |
|
test_when_finished rm -fr repo && |
|
git init repo && |
|
( |
|
cd repo && |
|
|
|
test_commit commit && |
|
git -c pack.writeReverseIndex=true repack -ad && |
|
git fsck 2>err && |
|
test_must_be_empty err |
|
) |
|
' |
|
|
|
test_expect_success 'set up rev-index corruption tests' ' |
|
git init corrupt && |
|
( |
|
cd corrupt && |
|
|
|
test_commit commit && |
|
git -c pack.writeReverseIndex=true repack -ad && |
|
|
|
revfile=$(ls .git/objects/pack/pack-*.rev) && |
|
chmod a+w $revfile && |
|
cp $revfile $revfile.bak |
|
) |
|
' |
|
|
|
corrupt_rev_and_verify () { |
|
( |
|
pos="$1" && |
|
value="$2" && |
|
error="$3" && |
|
|
|
cd corrupt && |
|
revfile=$(ls .git/objects/pack/pack-*.rev) && |
|
|
|
# Reset to original rev-file. |
|
cp $revfile.bak $revfile && |
|
|
|
printf "$value" | dd of=$revfile bs=1 seek="$pos" conv=notrunc && |
|
test_must_fail git fsck 2>err && |
|
grep "$error" err |
|
) |
|
} |
|
|
|
test_expect_success 'fsck catches invalid checksum' ' |
|
revfile=$(ls corrupt/.git/objects/pack/pack-*.rev) && |
|
orig_size=$(wc -c <$revfile) && |
|
hashpos=$((orig_size - 10)) && |
|
corrupt_rev_and_verify $hashpos bogus \ |
|
"invalid checksum" |
|
' |
|
|
|
test_expect_success 'fsck catches invalid row position' ' |
|
corrupt_rev_and_verify 14 "\07" \ |
|
"invalid rev-index position" |
|
' |
|
|
|
test_expect_success 'fsck catches invalid header: magic number' ' |
|
corrupt_rev_and_verify 1 "\07" \ |
|
"reverse-index file .* has unknown signature" |
|
' |
|
|
|
test_expect_success 'fsck catches invalid header: version' ' |
|
corrupt_rev_and_verify 7 "\02" \ |
|
"reverse-index file .* has unsupported version" |
|
' |
|
|
|
test_expect_success 'fsck catches invalid header: hash function' ' |
|
corrupt_rev_and_verify 11 "\03" \ |
|
"reverse-index file .* has unsupported hash id" |
|
' |
|
|
|
test_done
|
|
|