1#!/bin/sh
2
3test_description='pushing to a mirror repository'
4
5. ./test-lib.sh
6
7D=$(pwd)
8
9invert () {
10 if "$@"; then
11 return 1
12 else
13 return 0
14 fi
15}
16
17mk_repo_pair () {
18 rm -rf master mirror &&
19 mkdir mirror &&
20 (
21 cd mirror &&
22 git init &&
23 git config receive.denyCurrentBranch warn
24 ) &&
25 mkdir master &&
26 (
27 cd master &&
28 git init &&
29 git remote add $1 up ../mirror
30 )
31}
32
33
34# BRANCH tests
35test_expect_success 'push mirror creates new branches' '
36
37 mk_repo_pair &&
38 (
39 cd master &&
40 echo one >foo && git add foo && git commit -m one &&
41 git push --mirror up
42 ) &&
43 master_master=$(cd master && git show-ref -s --verify refs/heads/master) &&
44 mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) &&
45 test "$master_master" = "$mirror_master"
46
47'
48
49test_expect_success 'push mirror updates existing branches' '
50
51 mk_repo_pair &&
52 (
53 cd master &&
54 echo one >foo && git add foo && git commit -m one &&
55 git push --mirror up &&
56 echo two >foo && git add foo && git commit -m two &&
57 git push --mirror up
58 ) &&
59 master_master=$(cd master && git show-ref -s --verify refs/heads/master) &&
60 mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) &&
61 test "$master_master" = "$mirror_master"
62
63'
64
65test_expect_success 'push mirror force updates existing branches' '
66
67 mk_repo_pair &&
68 (
69 cd master &&
70 echo one >foo && git add foo && git commit -m one &&
71 git push --mirror up &&
72 echo two >foo && git add foo && git commit -m two &&
73 git push --mirror up &&
74 git reset --hard HEAD^ &&
75 git push --mirror up
76 ) &&
77 master_master=$(cd master && git show-ref -s --verify refs/heads/master) &&
78 mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) &&
79 test "$master_master" = "$mirror_master"
80
81'
82
83test_expect_success 'push mirror removes branches' '
84
85 mk_repo_pair &&
86 (
87 cd master &&
88 echo one >foo && git add foo && git commit -m one &&
89 git branch remove master &&
90 git push --mirror up &&
91 git branch -D remove &&
92 git push --mirror up
93 ) &&
94 (
95 cd mirror &&
96 invert git show-ref -s --verify refs/heads/remove
97 )
98
99'
100
101test_expect_success 'push mirror adds, updates and removes branches together' '
102
103 mk_repo_pair &&
104 (
105 cd master &&
106 echo one >foo && git add foo && git commit -m one &&
107 git branch remove master &&
108 git push --mirror up &&
109 git branch -D remove &&
110 git branch add master &&
111 echo two >foo && git add foo && git commit -m two &&
112 git push --mirror up
113 ) &&
114 master_master=$(cd master && git show-ref -s --verify refs/heads/master) &&
115 master_add=$(cd master && git show-ref -s --verify refs/heads/add) &&
116 mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) &&
117 mirror_add=$(cd mirror && git show-ref -s --verify refs/heads/add) &&
118 test "$master_master" = "$mirror_master" &&
119 test "$master_add" = "$mirror_add" &&
120 (
121 cd mirror &&
122 invert git show-ref -s --verify refs/heads/remove
123 )
124
125'
126
127
128# TAG tests
129test_expect_success 'push mirror creates new tags' '
130
131 mk_repo_pair &&
132 (
133 cd master &&
134 echo one >foo && git add foo && git commit -m one &&
135 git tag -f tmaster master &&
136 git push --mirror up
137 ) &&
138 master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) &&
139 mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) &&
140 test "$master_master" = "$mirror_master"
141
142'
143
144test_expect_success 'push mirror updates existing tags' '
145
146 mk_repo_pair &&
147 (
148 cd master &&
149 echo one >foo && git add foo && git commit -m one &&
150 git tag -f tmaster master &&
151 git push --mirror up &&
152 echo two >foo && git add foo && git commit -m two &&
153 git tag -f tmaster master &&
154 git push --mirror up
155 ) &&
156 master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) &&
157 mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) &&
158 test "$master_master" = "$mirror_master"
159
160'
161
162test_expect_success 'push mirror force updates existing tags' '
163
164 mk_repo_pair &&
165 (
166 cd master &&
167 echo one >foo && git add foo && git commit -m one &&
168 git tag -f tmaster master &&
169 git push --mirror up &&
170 echo two >foo && git add foo && git commit -m two &&
171 git tag -f tmaster master &&
172 git push --mirror up &&
173 git reset --hard HEAD^ &&
174 git tag -f tmaster master &&
175 git push --mirror up
176 ) &&
177 master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) &&
178 mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) &&
179 test "$master_master" = "$mirror_master"
180
181'
182
183test_expect_success 'push mirror removes tags' '
184
185 mk_repo_pair &&
186 (
187 cd master &&
188 echo one >foo && git add foo && git commit -m one &&
189 git tag -f tremove master &&
190 git push --mirror up &&
191 git tag -d tremove &&
192 git push --mirror up
193 ) &&
194 (
195 cd mirror &&
196 invert git show-ref -s --verify refs/tags/tremove
197 )
198
199'
200
201test_expect_success 'push mirror adds, updates and removes tags together' '
202
203 mk_repo_pair &&
204 (
205 cd master &&
206 echo one >foo && git add foo && git commit -m one &&
207 git tag -f tmaster master &&
208 git tag -f tremove master &&
209 git push --mirror up &&
210 git tag -d tremove &&
211 git tag tadd master &&
212 echo two >foo && git add foo && git commit -m two &&
213 git tag -f tmaster master &&
214 git push --mirror up
215 ) &&
216 master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) &&
217 master_add=$(cd master && git show-ref -s --verify refs/tags/tadd) &&
218 mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) &&
219 mirror_add=$(cd mirror && git show-ref -s --verify refs/tags/tadd) &&
220 test "$master_master" = "$mirror_master" &&
221 test "$master_add" = "$mirror_add" &&
222 (
223 cd mirror &&
224 invert git show-ref -s --verify refs/tags/tremove
225 )
226
227'
228
229test_expect_success 'remote.foo.mirror adds and removes branches' '
230
231 mk_repo_pair --mirror &&
232 (
233 cd master &&
234 echo one >foo && git add foo && git commit -m one &&
235 git branch keep master &&
236 git branch remove master &&
237 git push up &&
238 git branch -D remove &&
239 git push up
240 ) &&
241 (
242 cd mirror &&
243 git show-ref -s --verify refs/heads/keep &&
244 invert git show-ref -s --verify refs/heads/remove
245 )
246
247'
248
249test_expect_success 'remote.foo.mirror=no has no effect' '
250
251 mk_repo_pair &&
252 (
253 cd master &&
254 echo one >foo && git add foo && git commit -m one &&
255 git config --add remote.up.mirror no &&
256 git branch keep master &&
257 git push --mirror up &&
258 git branch -D keep &&
259 git push up :
260 ) &&
261 (
262 cd mirror &&
263 git show-ref -s --verify refs/heads/keep
264 )
265
266'
267
268test_expect_success 'push to mirrored repository with refspec fails' '
269 mk_repo_pair &&
270 (
271 cd master &&
272 echo one >foo && git add foo && git commit -m one &&
273 git config --add remote.up.mirror true &&
274 test_must_fail git push up master
275 )
276'
277
278test_done