refs: demonstrate excessive execution of the reference-transaction hook

Add tests which demonstate that we're executing the
reference-transaction hook too often in some cases, which thus leaks
implementation details about the reference store's implementation
itself. Behaviour will be fixed in follow-up commits.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt 2022-01-17 09:12:44 +01:00 committed by Junio C Hamano
parent 958fbc74e3
commit 2ce8254362

View file

@ -136,4 +136,68 @@ test_expect_success 'interleaving hook calls succeed' '
test_cmp expect target-repo.git/actual
'
test_expect_success 'hook does not get called on packing refs' '
# Pack references first such that we are in a known state.
git pack-refs --all &&
write_script .git/hooks/reference-transaction <<-\EOF &&
echo "$@" >>actual
cat >>actual
EOF
rm -f actual &&
git update-ref refs/heads/unpacked-ref $POST_OID &&
git pack-refs --all &&
# We only expect a single hook invocation, which is the call to
# git-update-ref(1). But currently, packing refs will also trigger the
# hook.
cat >expect <<-EOF &&
prepared
$ZERO_OID $POST_OID refs/heads/unpacked-ref
committed
$ZERO_OID $POST_OID refs/heads/unpacked-ref
prepared
$ZERO_OID $POST_OID refs/heads/unpacked-ref
committed
$ZERO_OID $POST_OID refs/heads/unpacked-ref
prepared
$POST_OID $ZERO_OID refs/heads/unpacked-ref
committed
$POST_OID $ZERO_OID refs/heads/unpacked-ref
EOF
test_cmp expect actual
'
test_expect_success 'deleting packed ref calls hook once' '
# Create a reference and pack it.
git update-ref refs/heads/to-be-deleted $POST_OID &&
git pack-refs --all &&
write_script .git/hooks/reference-transaction <<-\EOF &&
echo "$@" >>actual
cat >>actual
EOF
rm -f actual &&
git update-ref -d refs/heads/to-be-deleted $POST_OID &&
# We only expect a single hook invocation, which is the logical
# deletion. But currently, we see two interleaving transactions, once
# for deleting the loose refs and once for deleting the packed ref.
cat >expect <<-EOF &&
prepared
$ZERO_OID $ZERO_OID refs/heads/to-be-deleted
prepared
$POST_OID $ZERO_OID refs/heads/to-be-deleted
committed
$ZERO_OID $ZERO_OID refs/heads/to-be-deleted
committed
$POST_OID $ZERO_OID refs/heads/to-be-deleted
EOF
test_cmp expect actual
'
test_done