t5408, t5410: test duplicate updates without relying on the client
The existing t5408 tests that use send-pack to transmit duplicate updates for the same destination happen to rely on the client not recognizing the duplicates when the remote is empty. As a result, they are the only push tests that exercise each of: - receive-pack rejection of multiple updates for the same ref, fromseen9d2962a7c4(receive-pack: use batched reference updates, 2025-05-19) - send-pack's receive_status() handling of a ref reported twice by the remote, from77188b5bba(send-pack: fix memory leak around duplicate refs, 2025-05-19) Add explicit tests for each of those paths, in preparation of an upcoming commit that fixes the client to reject such pushes before sending any update. Signed-off-by: Jon Simons <jon@jonsimons.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
parent
732abd6821
commit
20a198a63b
|
|
@ -89,6 +89,18 @@ test_expect_success '--stdin refs come after cmdline' '
|
|||
test_must_fail git --git-dir=remote.git rev-parse foo
|
||||
'
|
||||
|
||||
test_expect_success 'send-pack handles repeated status for the same ref' '
|
||||
clear_remote &&
|
||||
test_hook -C remote.git receive-report <<-\EOF &&
|
||||
cat >/dev/null &&
|
||||
printf "%s\n" "unpack ok" "ng refs/heads/foo first" \
|
||||
"ng refs/heads/foo second" 0000 |
|
||||
test-tool pkt-line pack
|
||||
EOF
|
||||
test_must_fail git send-pack remote.git A:foo 2>err &&
|
||||
test_grep "remote rejected.*A -> foo (second)" err
|
||||
'
|
||||
|
||||
test_expect_success 'refspecs and --mirror do not mix (cmdline)' '
|
||||
clear_remote &&
|
||||
test_must_fail git send-pack remote.git --mirror $(cat refs)
|
||||
|
|
|
|||
|
|
@ -97,4 +97,39 @@ test_expect_success TEE_DOES_NOT_HANG \
|
|||
test_must_fail git -C remote.git rev-list $(git -C repo rev-parse HEAD)
|
||||
'
|
||||
|
||||
test_expect_success 'receive-pack rejects multiple updates for the same ref' '
|
||||
test_when_finished "rm -rf repo remote.git" &&
|
||||
|
||||
git init repo &&
|
||||
git -C repo commit --allow-empty -m A &&
|
||||
git -C repo branch A &&
|
||||
git -C repo commit --allow-empty -m B &&
|
||||
git -C repo branch B &&
|
||||
git init --bare remote.git &&
|
||||
git -C repo send-pack ../remote.git A B &&
|
||||
A=$(git -C repo rev-parse A) &&
|
||||
B=$(git -C repo rev-parse B) &&
|
||||
{
|
||||
printf "%s %s refs/heads/foo\0report-status object-format=%s" \
|
||||
$ZERO_OID $A "$(test_oid algo)" |
|
||||
test-tool pkt-line pack-raw-stdin &&
|
||||
printf "%s %s refs/heads/foo" $ZERO_OID $B |
|
||||
test-tool pkt-line pack-raw-stdin &&
|
||||
printf 0000 &&
|
||||
git pack-objects --stdout </dev/null
|
||||
} >request &&
|
||||
git receive-pack remote.git <request >response 2>err &&
|
||||
test_grep "multiple updates for ref ${SQ}refs/heads/foo${SQ} not allowed" err &&
|
||||
test-tool pkt-line unpack <response >report &&
|
||||
sed -n "/^unpack /,\$p" report >actual &&
|
||||
cat >expect <<-\EOF &&
|
||||
unpack ok
|
||||
ng refs/heads/foo failed to update refs
|
||||
ng refs/heads/foo failed to update refs
|
||||
0000
|
||||
EOF
|
||||
test_cmp expect actual &&
|
||||
test_must_fail git --git-dir=remote.git rev-parse --verify refs/heads/foo
|
||||
'
|
||||
|
||||
test_done
|
||||
|
|
|
|||
Loading…
Reference in New Issue