1#!/bin/sh
2
3test_description='check quarantine of objects during push'
4. ./test-lib.sh
5
6test_expect_success 'create picky dest repo' '
7	git init --bare dest.git &&
8	write_script dest.git/hooks/pre-receive <<-\EOF
9	while read old new ref; do
10		test "$(git log -1 --format=%s $new)" = reject && exit 1
11	done
12	exit 0
13	EOF
14'
15
16test_expect_success 'accepted objects work' '
17	test_commit ok &&
18	git push dest.git HEAD &&
19	commit=$(git rev-parse HEAD) &&
20	git --git-dir=dest.git cat-file commit $commit
21'
22
23test_expect_success 'rejected objects are not installed' '
24	test_commit reject &&
25	commit=$(git rev-parse HEAD) &&
26	test_must_fail git push dest.git reject &&
27	test_must_fail git --git-dir=dest.git cat-file commit $commit
28'
29
30test_expect_success 'rejected objects are removed' '
31	echo "incoming-*" >expect &&
32	(cd dest.git/objects && echo incoming-*) >actual &&
33	test_cmp expect actual
34'
35
36test_expect_success 'push to repo path with path separator (colon)' '
37	# The interesting failure case here is when the
38	# receiving end cannot access its original object directory,
39	# so make it likely for us to generate a delta by having
40	# a non-trivial file with multiple versions.
41
42	test-tool genrandom foo 4096 >file.bin &&
43	git add file.bin &&
44	git commit -m bin &&
45
46	if test_have_prereq MINGW
47	then
48		pathsep=";"
49	else
50		pathsep=":"
51	fi &&
52	git clone --bare . "xxx${pathsep}yyy.git" &&
53
54	echo change >>file.bin &&
55	git commit -am change &&
56	# Note that we have to use the full path here, or it gets confused
57	# with the ssh host:path syntax.
58	git push "$(pwd)/xxx${pathsep}yyy.git" HEAD
59'
60
61test_expect_success 'updating a ref from quarantine is forbidden' '
62	git init --bare update.git &&
63	write_script update.git/hooks/pre-receive <<-\EOF &&
64	read old new refname
65	git update-ref refs/heads/unrelated $new
66	exit 1
67	EOF
68	test_must_fail git push update.git HEAD &&
69	git -C update.git fsck
70'
71
72test_done
73