git/t/t5325-reverse-index.sh
Eric Sunshine d0fd993137 t5000-t5999: detect and signal failure within loop
Failures within `for` and `while` loops can go unnoticed if not detected
and signaled manually since the loop itself does not abort when a
contained command fails, nor will a failure necessarily be detected when
the loop finishes since the loop returns the exit code of the last
command it ran on the final iteration, which may not be the command
which failed. Therefore, detect and signal failures manually within
loops using the idiom `|| return 1` (or `|| exit 1` within subshells).

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Reviewed-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-12-13 10:29:48 -08:00

120 lines
3 KiB
Bash
Executable file

#!/bin/sh
test_description='on-disk reverse index'
. ./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_WRITE_REV_INDEX
packdir=.git/objects/pack
test_expect_success 'setup' '
test_commit base &&
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 '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_done