mirror of
https://github.com/git/git
synced 2024-09-13 13:24:41 +00:00
d8f4481c4f
As documented in git-receive-pack(1), updating a ref from within the pre-receive hook is dangerous and can corrupt your repo. This patch forbids ref updates entirely during the hook to make it harder for adventurous hook writers to shoot themselves in the foot. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
48 lines
1.2 KiB
Bash
Executable file
48 lines
1.2 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='check quarantine of objects during push'
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success 'create picky dest repo' '
|
|
git init --bare dest.git &&
|
|
write_script dest.git/hooks/pre-receive <<-\EOF
|
|
while read old new ref; do
|
|
test "$(git log -1 --format=%s $new)" = reject && exit 1
|
|
done
|
|
exit 0
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'accepted objects work' '
|
|
test_commit ok &&
|
|
git push dest.git HEAD &&
|
|
commit=$(git rev-parse HEAD) &&
|
|
git --git-dir=dest.git cat-file commit $commit
|
|
'
|
|
|
|
test_expect_success 'rejected objects are not installed' '
|
|
test_commit reject &&
|
|
commit=$(git rev-parse HEAD) &&
|
|
test_must_fail git push dest.git reject &&
|
|
test_must_fail git --git-dir=dest.git cat-file commit $commit
|
|
'
|
|
|
|
test_expect_success 'rejected objects are removed' '
|
|
echo "incoming-*" >expect &&
|
|
(cd dest.git/objects && echo incoming-*) >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'updating a ref from quarantine is forbidden' '
|
|
git init --bare update.git &&
|
|
write_script update.git/hooks/pre-receive <<-\EOF &&
|
|
read old new refname
|
|
git update-ref refs/heads/unrelated $new
|
|
exit 1
|
|
EOF
|
|
test_must_fail git push update.git HEAD &&
|
|
git -C update.git fsck
|
|
'
|
|
|
|
test_done
|