Raw
1 #!/bin/sh
2
3 test_description='send-pack --stdin tests'
4
5 . ./test-lib.sh
6
7 create_ref () {
8 tree=$(git write-tree) &&
9 test_tick &&
10 commit=$(echo "$1" | git commit-tree $tree) &&
11 git update-ref "$1" $commit
12 }
13
14 clear_remote () {
15 rm -rf remote.git &&
16 git init --bare remote.git
17 }
18
19 verify_push () {
20 git rev-parse "$1" >expect &&
21 git --git-dir=remote.git rev-parse "${2:-$1}" >actual &&
22 test_cmp expect actual
23 }
24
25 test_expect_success 'setup refs' '
26 cat >refs <<-\EOF &&
27 refs/heads/A
28 refs/heads/C
29 refs/tags/D
30 refs/heads/B
31 refs/tags/E
32 EOF
33 for i in $(cat refs); do
34 create_ref $i || return 1
35 done
36 '
37
38 # sanity check our setup
39 test_expect_success 'refs on cmdline' '
40 clear_remote &&
41 git send-pack remote.git $(cat refs) &&
42 for i in $(cat refs); do
43 verify_push $i || return 1
44 done
45 '
46
47 test_expect_success 'refs over stdin' '
48 clear_remote &&
49 git send-pack remote.git --stdin <refs &&
50 for i in $(cat refs); do
51 verify_push $i || return 1
52 done
53 '
54
55 test_expect_success 'stdin lines are full refspecs' '
56 clear_remote &&
57 echo "A:other" >input &&
58 git send-pack remote.git --stdin <input &&
59 verify_push refs/heads/A refs/heads/other
60 '
61
62 test_expect_success 'stdin mixed with cmdline' '
63 clear_remote &&
64 echo A >input &&
65 git send-pack remote.git --stdin B <input &&
66 verify_push A &&
67 verify_push B
68 '
69
70 test_expect_success 'cmdline refs written in order' '
71 clear_remote &&
72 test_must_fail git send-pack remote.git A:foo B:foo 2>err &&
73 test_grep "multiple updates for ref ${SQ}refs/heads/foo${SQ} not allowed" err &&
74 test_must_fail git --git-dir=remote.git rev-parse foo
75 '
76
77 test_expect_success 'cmdline refs with multiple duplicates' '
78 clear_remote &&
79 test_must_fail git send-pack remote.git A:foo B:foo C:foo 2>err &&
80 test_grep "multiple updates for ref ${SQ}refs/heads/foo${SQ} not allowed" err &&
81 test_must_fail git --git-dir=remote.git rev-parse foo
82 '
83
84 test_expect_success '--stdin refs come after cmdline' '
85 clear_remote &&
86 echo A:foo >input &&
87 test_must_fail git send-pack remote.git --stdin B:foo <input &&
88 test_grep "multiple updates for ref ${SQ}refs/heads/foo${SQ} not allowed" err &&
89 test_must_fail git --git-dir=remote.git rev-parse foo
90 '
91
92 test_expect_success 'refspecs and --mirror do not mix (cmdline)' '
93 clear_remote &&
94 test_must_fail git send-pack remote.git --mirror $(cat refs)
95 '
96
97 test_expect_success 'refspecs and --mirror do not mix (stdin)' '
98 clear_remote &&
99 test_must_fail git send-pack remote.git --mirror --stdin <refs
100 '
101
102 test_done