Merge branch 'master' of git://repo.or.cz/alt-git
[git/dscho.git] / t / t5505-remote.sh
blobb4dc0d2fbe2a301d1f01701bc5d11805ce6357c2
1 #!/bin/sh
3 test_description='git remote porcelain-ish'
5 . ./test-lib.sh
7 setup_repository () {
8 mkdir "$1" && (
9 cd "$1" &&
10 git init &&
11 >file &&
12 git add file &&
13 test_tick &&
14 git commit -m "Initial" &&
15 git checkout -b side &&
16 >elif &&
17 git add elif &&
18 test_tick &&
19 git commit -m "Second" &&
20 git checkout master
24 tokens_match () {
25 echo "$1" | tr ' ' '\012' | sort | sed -e '/^$/d' >expect &&
26 echo "$2" | tr ' ' '\012' | sort | sed -e '/^$/d' >actual &&
27 test_cmp expect actual
30 check_remote_track () {
31 actual=$(git remote show "$1" | sed -e '1,/Tracked/d') &&
32 shift &&
33 tokens_match "$*" "$actual"
36 check_tracking_branch () {
37 f="" &&
38 r=$(git for-each-ref "--format=%(refname)" |
39 sed -ne "s|^refs/remotes/$1/||p") &&
40 shift &&
41 tokens_match "$*" "$r"
44 test_expect_success setup '
46 setup_repository one &&
47 setup_repository two &&
49 cd two && git branch another
50 ) &&
51 git clone one test
55 test_expect_success 'remote information for the origin' '
57 cd test &&
58 tokens_match origin "$(git remote)" &&
59 check_remote_track origin master side &&
60 check_tracking_branch origin HEAD master side
64 test_expect_success 'add another remote' '
66 cd test &&
67 git remote add -f second ../two &&
68 tokens_match "origin second" "$(git remote)" &&
69 check_remote_track origin master side &&
70 check_remote_track second master side another &&
71 check_tracking_branch second master side another &&
72 git for-each-ref "--format=%(refname)" refs/remotes |
73 sed -e "/^refs\/remotes\/origin\//d" \
74 -e "/^refs\/remotes\/second\//d" >actual &&
75 >expect &&
76 test_cmp expect actual
80 test_expect_success 'remote forces tracking branches' '
82 cd test &&
83 case `git config remote.second.fetch` in
84 +*) true ;;
85 *) false ;;
86 esac
90 test_expect_success 'remove remote' '
92 cd test &&
93 git symbolic-ref refs/remotes/second/HEAD refs/remotes/second/master &&
94 git remote rm second
98 test_expect_success 'remove remote' '
100 cd test &&
101 tokens_match origin "$(git remote)" &&
102 check_remote_track origin master side &&
103 git for-each-ref "--format=%(refname)" refs/remotes |
104 sed -e "/^refs\/remotes\/origin\//d" >actual &&
105 >expect &&
106 test_cmp expect actual
110 case $(uname -s) in
111 *MINGW*) pwd() { builtin pwd -W; } ;;
112 esac
113 cat > test/expect << EOF
114 * remote origin
115 URL: $(pwd)/one
116 Remote branch merged with 'git pull' while on branch master
117 master
118 New remote branch (next fetch will store in remotes/origin)
119 master
120 Tracked remote branches
121 side
122 master
123 Local branches pushed with 'git push'
124 master:upstream
125 +refs/tags/lastbackup
128 test_expect_success 'show' '
129 (cd test &&
130 git config --add remote.origin.fetch \
131 refs/heads/master:refs/heads/upstream &&
132 git fetch &&
133 git branch -d -r origin/master &&
134 (cd ../one &&
135 echo 1 > file &&
136 test_tick &&
137 git commit -m update file) &&
138 git config remote.origin.push \
139 refs/heads/master:refs/heads/upstream &&
140 git config --add remote.origin.push \
141 +refs/tags/lastbackup &&
142 git remote show origin > output &&
143 test_cmp expect output)
146 cat > test/expect << EOF
147 * remote origin
148 URL: $(pwd)/one
149 Remote branch merged with 'git pull' while on branch master
150 master
151 Tracked remote branches
152 master
153 side
154 Local branches pushed with 'git push'
155 master:upstream
156 +refs/tags/lastbackup
159 test_expect_success 'show -n' '
160 (mv one one.unreachable &&
161 cd test &&
162 git remote show -n origin > output &&
163 mv ../one.unreachable ../one &&
164 test_cmp expect output)
167 test_expect_success 'prune' '
168 (cd one &&
169 git branch -m side side2) &&
170 (cd test &&
171 git fetch origin &&
172 git remote prune origin &&
173 git rev-parse refs/remotes/origin/side2 &&
174 test_must_fail git rev-parse refs/remotes/origin/side)
177 cat > test/expect << EOF
178 Pruning origin
179 URL: $(pwd)/one
180 * [would prune] origin/side2
183 test_expect_success 'prune --dry-run' '
184 (cd one &&
185 git branch -m side2 side) &&
186 (cd test &&
187 git remote prune --dry-run origin > output &&
188 git rev-parse refs/remotes/origin/side2 &&
189 test_must_fail git rev-parse refs/remotes/origin/side &&
190 (cd ../one &&
191 git branch -m side side2) &&
192 test_cmp expect output)
195 test_expect_success 'add --mirror && prune' '
196 (mkdir mirror &&
197 cd mirror &&
198 git init --bare &&
199 git remote add --mirror -f origin ../one) &&
200 (cd one &&
201 git branch -m side2 side) &&
202 (cd mirror &&
203 git rev-parse --verify refs/heads/side2 &&
204 test_must_fail git rev-parse --verify refs/heads/side &&
205 git fetch origin &&
206 git remote prune origin &&
207 test_must_fail git rev-parse --verify refs/heads/side2 &&
208 git rev-parse --verify refs/heads/side)
211 test_expect_success 'add alt && prune' '
212 (mkdir alttst &&
213 cd alttst &&
214 git init &&
215 git remote add -f origin ../one &&
216 git config remote.alt.url ../one &&
217 git config remote.alt.fetch "+refs/heads/*:refs/remotes/origin/*") &&
218 (cd one &&
219 git branch -m side side2) &&
220 (cd alttst &&
221 git rev-parse --verify refs/remotes/origin/side &&
222 test_must_fail git rev-parse --verify refs/remotes/origin/side2 &&
223 git fetch alt &&
224 git remote prune alt &&
225 test_must_fail git rev-parse --verify refs/remotes/origin/side &&
226 git rev-parse --verify refs/remotes/origin/side2)
229 cat > one/expect << EOF
230 apis/master
231 apis/side
232 drosophila/another
233 drosophila/master
234 drosophila/side
237 test_expect_success 'update' '
239 (cd one &&
240 git remote add drosophila ../two &&
241 git remote add apis ../mirror &&
242 git remote update &&
243 git branch -r > output &&
244 test_cmp expect output)
248 cat > one/expect << EOF
249 drosophila/another
250 drosophila/master
251 drosophila/side
252 manduca/master
253 manduca/side
254 megaloprepus/master
255 megaloprepus/side
258 test_expect_success 'update with arguments' '
260 (cd one &&
261 for b in $(git branch -r)
263 git branch -r -d $b || break
264 done &&
265 git remote add manduca ../mirror &&
266 git remote add megaloprepus ../mirror &&
267 git config remotes.phobaeticus "drosophila megaloprepus" &&
268 git config remotes.titanus manduca &&
269 git remote update phobaeticus titanus &&
270 git branch -r > output &&
271 test_cmp expect output)
275 cat > one/expect << EOF
276 apis/master
277 apis/side
278 manduca/master
279 manduca/side
280 megaloprepus/master
281 megaloprepus/side
284 test_expect_success 'update default' '
286 (cd one &&
287 for b in $(git branch -r)
289 git branch -r -d $b || break
290 done &&
291 git config remote.drosophila.skipDefaultUpdate true &&
292 git remote update default &&
293 git branch -r > output &&
294 test_cmp expect output)
298 cat > one/expect << EOF
299 drosophila/another
300 drosophila/master
301 drosophila/side
304 test_expect_success 'update default (overridden, with funny whitespace)' '
306 (cd one &&
307 for b in $(git branch -r)
309 git branch -r -d $b || break
310 done &&
311 git config remotes.default "$(printf "\t drosophila \n")" &&
312 git remote update default &&
313 git branch -r > output &&
314 test_cmp expect output)
318 test_expect_success '"remote show" does not show symbolic refs' '
320 git clone one three &&
321 (cd three &&
322 git remote show origin > output &&
323 ! grep HEAD < output &&
324 ! grep -i stale < output)
328 test_expect_success 'reject adding remote with an invalid name' '
330 test_must_fail git remote add some:url desired-name
334 # The first three test if the tracking branches are properly renamed,
335 # the last two ones check if the config is updated.
337 test_expect_success 'rename a remote' '
339 git clone one four &&
340 (cd four &&
341 git remote rename origin upstream &&
342 rmdir .git/refs/remotes/origin &&
343 test "$(git symbolic-ref refs/remotes/upstream/HEAD)" = "refs/remotes/upstream/master" &&
344 test "$(git rev-parse upstream/master)" = "$(git rev-parse master)" &&
345 test "$(git config remote.upstream.fetch)" = "+refs/heads/*:refs/remotes/upstream/*" &&
346 test "$(git config branch.master.remote)" = "upstream")
350 cat > remotes_origin << EOF
351 URL: $(pwd)/one
352 Push: refs/heads/master:refs/heads/upstream
353 Pull: refs/heads/master:refs/heads/origin
356 test_expect_success 'migrate a remote from named file in $GIT_DIR/remotes' '
357 git clone one five &&
358 origin_url=$(pwd)/one &&
359 (cd five &&
360 git remote rm origin &&
361 mkdir -p .git/remotes &&
362 cat ../remotes_origin > .git/remotes/origin &&
363 git remote rename origin origin &&
364 ! test -f .git/remotes/origin &&
365 test "$(git config remote.origin.url)" = "$origin_url" &&
366 test "$(git config remote.origin.push)" = "refs/heads/master:refs/heads/upstream" &&
367 test "$(git config remote.origin.fetch)" = "refs/heads/master:refs/heads/origin")
370 test_expect_success 'migrate a remote from named file in $GIT_DIR/branches' '
371 git clone one six &&
372 origin_url=$(pwd)/one &&
373 (cd six &&
374 git remote rm origin &&
375 echo "$origin_url" > .git/branches/origin &&
376 git remote rename origin origin &&
377 ! test -f .git/branches/origin &&
378 test "$(git config remote.origin.url)" = "$origin_url" &&
379 test "$(git config remote.origin.fetch)" = "refs/heads/master:refs/heads/origin")
382 test_done