git/t/t0614-reftable-fsck.sh
Patrick Steinhardt 8a3de73c64 refs/reftable: introduce generic checks for refs
In a preceding commit we have extracted generic checks for both direct
and symbolic refs that apply for all backends. Wire up those checks for
the "reftable" backend.

Note that this is done by iterating through all refs manually with the
low-level reftable ref iterator. We explicitly don't want to use the
higher-level iterator that is exposed to users of the reftable backend
as that iterator may swallow for example broken refs.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-01-09 07:23:13 -08:00

103 lines
2.7 KiB
Bash
Executable File

#!/bin/sh
test_description='Test reftable backend consistency check'
GIT_TEST_DEFAULT_REF_FORMAT=reftable
export GIT_TEST_DEFAULT_REF_FORMAT
. ./test-lib.sh
test_expect_success "no errors reported on a well formed repository" '
test_when_finished "rm -rf repo" &&
git init repo &&
(
cd repo &&
git commit --allow-empty -m initial &&
for i in $(test_seq 20)
do
git update-ref refs/heads/branch-$i HEAD || return 1
done &&
# The repository should end up with multiple tables.
test_line_count -gt 1 .git/reftable/tables.list &&
git refs verify 2>err &&
test_must_be_empty err
)
'
for TABLE_NAME in "foo-bar-e4d12d59.ref" \
"0x00000000zzzz-0x00000000zzzz-e4d12d59.ref" \
"0x000000000001-0x000000000002-e4d12d59.abc" \
"0x000000000001-0x000000000002-e4d12d59.refabc"; do
test_expect_success "table name $TABLE_NAME should be checked" '
test_when_finished "rm -rf repo" &&
git init repo &&
(
cd repo &&
git commit --allow-empty -m initial &&
git refs verify 2>err &&
test_must_be_empty err &&
EXISTING_TABLE=$(head -n1 .git/reftable/tables.list) &&
mv ".git/reftable/$EXISTING_TABLE" ".git/reftable/$TABLE_NAME" &&
sed "s/${EXISTING_TABLE}/${TABLE_NAME}/g" .git/reftable/tables.list > tables.list &&
mv tables.list .git/reftable/tables.list &&
git refs verify 2>err &&
cat >expect <<-EOF &&
warning: ${TABLE_NAME}: badReftableTableName: invalid reftable table name
EOF
test_cmp expect err
)
'
done
test_expect_success 'worktree stacks can be verified' '
test_when_finished "rm -rf repo worktree" &&
git init repo &&
test_commit -C repo initial &&
git -C repo worktree add ../worktree &&
git -C worktree refs verify 2>err &&
test_must_be_empty err &&
REFTABLE_DIR=$(git -C worktree rev-parse --git-dir)/reftable &&
EXISTING_TABLE=$(head -n1 "$REFTABLE_DIR/tables.list") &&
mv "$REFTABLE_DIR/$EXISTING_TABLE" "$REFTABLE_DIR/broken.ref" &&
for d in repo worktree
do
echo "broken.ref" >"$REFTABLE_DIR/tables.list" &&
git -C "$d" refs verify 2>err &&
cat >expect <<-EOF &&
warning: broken.ref: badReftableTableName: invalid reftable table name
EOF
test_cmp expect err &&
echo garbage >"$REFTABLE_DIR/tables.list" &&
test_must_fail git -C "$d" refs verify 2>err &&
cat >expect <<-EOF &&
error: reftable stack for worktree ${SQ}worktree${SQ} is broken
EOF
test_cmp expect err || return 1
done
'
test_expect_success 'invalid symref gets reported' '
test_when_finished "rm -rf repo" &&
git init repo &&
test_commit -C repo initial &&
git -C repo symbolic-ref refs/heads/symref garbage &&
test_must_fail git -C repo refs verify 2>err &&
cat >expect <<-EOF &&
error: refs/heads/symref: badReferentName: points to invalid refname ${SQ}garbage${SQ}
EOF
test_cmp expect err
'
test_done