blob: d13c806624bcc8a404be97d61500e8e1d4614c6b [file] [log] [blame]
Junio C Hamano7be1d622006-09-23 03:40:17 -07001#!/bin/sh
2# Copyright (c) 2006, Junio C Hamano.
3
4test_description='Per branch config variables affects "git fetch".
5
6'
7
8. ./test-lib.sh
9
10D=`pwd`
11
Junio C Hamano2e674a92009-08-07 20:12:13 -070012test_bundle_object_count () {
13 git verify-pack -v "$1" >verify.out &&
14 test "$2" = $(grep '^[0-9a-f]\{40\} ' verify.out | wc -l)
15}
16
Junio C Hamano7be1d622006-09-23 03:40:17 -070017test_expect_success setup '
18 echo >file original &&
19 git add file &&
20 git commit -a -m original'
21
22test_expect_success "clone and setup child repos" '
23 git clone . one &&
24 cd one &&
25 echo >file updated by one &&
26 git commit -a -m "updated by one" &&
27 cd .. &&
28 git clone . two &&
29 cd two &&
Tom Princee0d10e12007-01-28 16:16:53 -080030 git config branch.master.remote one &&
31 git config remote.one.url ../one/.git/ &&
32 git config remote.one.fetch refs/heads/master:refs/heads/one &&
Santi Béjar6cc7c362006-09-23 22:55:35 +020033 cd .. &&
34 git clone . three &&
35 cd three &&
Tom Princee0d10e12007-01-28 16:16:53 -080036 git config branch.master.remote two &&
37 git config branch.master.merge refs/heads/one &&
Junio C Hamano75c384e2006-12-19 01:50:37 -080038 mkdir -p .git/remotes &&
Santi Béjar6cc7c362006-09-23 22:55:35 +020039 {
40 echo "URL: ../two/.git/"
41 echo "Pull: refs/heads/master:refs/heads/two"
42 echo "Pull: refs/heads/one:refs/heads/one"
Johannes Schindelin2e0afaf2007-02-22 01:59:14 +010043 } >.git/remotes/two &&
44 cd .. &&
Jeff King9a7bbd12008-06-16 12:15:02 -040045 git clone . bundle &&
46 git clone . seven
Junio C Hamano7be1d622006-09-23 03:40:17 -070047'
48
49test_expect_success "fetch test" '
50 cd "$D" &&
51 echo >file updated by origin &&
52 git commit -a -m "updated by origin" &&
53 cd two &&
54 git fetch &&
55 test -f .git/refs/heads/one &&
56 mine=`git rev-parse refs/heads/one` &&
57 his=`cd ../one && git rev-parse refs/heads/master` &&
58 test "z$mine" = "z$his"
59'
60
Santi Béjar6cc7c362006-09-23 22:55:35 +020061test_expect_success "fetch test for-merge" '
62 cd "$D" &&
63 cd three &&
64 git fetch &&
65 test -f .git/refs/heads/two &&
66 test -f .git/refs/heads/one &&
67 master_in_two=`cd ../two && git rev-parse master` &&
68 one_in_two=`cd ../two && git rev-parse one` &&
69 {
70 echo "$master_in_two not-for-merge"
71 echo "$one_in_two "
72 } >expected &&
73 cut -f -2 .git/FETCH_HEAD >actual &&
74 diff expected actual'
75
Väinö Järveläf539d0d2007-10-09 11:51:07 +030076test_expect_success 'fetch tags when there is no tags' '
77
78 cd "$D" &&
79
80 mkdir notags &&
81 cd notags &&
82 git init &&
83
84 git fetch -t ..
85
86'
87
Junio C Hamano6c96c0f2006-11-18 21:39:17 -080088test_expect_success 'fetch following tags' '
89
90 cd "$D" &&
91 git tag -a -m 'annotated' anno HEAD &&
92 git tag light HEAD &&
93
94 mkdir four &&
95 cd four &&
Nicolas Pitre5c94f872007-01-12 16:01:46 -050096 git init &&
Junio C Hamano6c96c0f2006-11-18 21:39:17 -080097
98 git fetch .. :track &&
99 git show-ref --verify refs/tags/anno &&
100 git show-ref --verify refs/tags/light
101
102'
103
Junio C Hamano41ac4142008-02-01 01:50:53 -0800104test_expect_success 'fetch must not resolve short tag name' '
Steffen Prohaska605b4972007-11-11 15:01:48 +0100105
106 cd "$D" &&
107
108 mkdir five &&
109 cd five &&
110 git init &&
111
Stephan Beyerd492b312008-07-12 17:47:52 +0200112 test_must_fail git fetch .. anno:five
Steffen Prohaska605b4972007-11-11 15:01:48 +0100113
114'
115
Junio C Hamano41ac4142008-02-01 01:50:53 -0800116test_expect_success 'fetch must not resolve short remote name' '
Steffen Prohaska605b4972007-11-11 15:01:48 +0100117
118 cd "$D" &&
Nanako Shiraishi3604e7c2008-09-03 17:59:29 +0900119 git update-ref refs/remotes/six/HEAD HEAD
Steffen Prohaska605b4972007-11-11 15:01:48 +0100120
121 mkdir six &&
122 cd six &&
123 git init &&
124
Stephan Beyerd492b312008-07-12 17:47:52 +0200125 test_must_fail git fetch .. six:six
Steffen Prohaska605b4972007-11-11 15:01:48 +0100126
127'
128
Johannes Schindelin2e0afaf2007-02-22 01:59:14 +0100129test_expect_success 'create bundle 1' '
130 cd "$D" &&
131 echo >file updated again by origin &&
132 git commit -a -m "tip" &&
133 git bundle create bundle1 master^..master
134'
135
Johannes Schindelin83155882007-03-06 22:57:07 +0100136test_expect_success 'header of bundle looks right' '
137 head -n 1 "$D"/bundle1 | grep "^#" &&
138 head -n 2 "$D"/bundle1 | grep "^-[0-9a-f]\{40\} " &&
139 head -n 3 "$D"/bundle1 | grep "^[0-9a-f]\{40\} " &&
140 head -n 4 "$D"/bundle1 | grep "^$"
141'
142
Johannes Schindelin2e0afaf2007-02-22 01:59:14 +0100143test_expect_success 'create bundle 2' '
144 cd "$D" &&
145 git bundle create bundle2 master~2..master
146'
147
Junio C Hamano41ac4142008-02-01 01:50:53 -0800148test_expect_success 'unbundle 1' '
Johannes Schindelin2e0afaf2007-02-22 01:59:14 +0100149 cd "$D/bundle" &&
150 git checkout -b some-branch &&
Stephan Beyerd492b312008-07-12 17:47:52 +0200151 test_must_fail git fetch "$D/bundle1" master:master
Johannes Schindelin2e0afaf2007-02-22 01:59:14 +0100152'
153
Junio C Hamano2e674a92009-08-07 20:12:13 -0700154
Johannes Schindelin83155882007-03-06 22:57:07 +0100155test_expect_success 'bundle 1 has only 3 files ' '
156 cd "$D" &&
157 (
158 while read x && test -n "$x"
159 do
160 :;
161 done
162 cat
163 ) <bundle1 >bundle.pack &&
164 git index-pack bundle.pack &&
Junio C Hamano2e674a92009-08-07 20:12:13 -0700165 test_bundle_object_count bundle.pack 3
Johannes Schindelin83155882007-03-06 22:57:07 +0100166'
167
Johannes Schindelin2e0afaf2007-02-22 01:59:14 +0100168test_expect_success 'unbundle 2' '
169 cd "$D/bundle" &&
170 git fetch ../bundle2 master:master &&
171 test "tip" = "$(git log -1 --pretty=oneline master | cut -b42-)"
172'
173
Johannes Schindelin18449ab2007-03-08 00:43:05 +0100174test_expect_success 'bundle does not prerequisite objects' '
175 cd "$D" &&
176 touch file2 &&
177 git add file2 &&
178 git commit -m add.file2 file2 &&
179 git bundle create bundle3 -1 HEAD &&
Shawn O. Pearce6016e352007-03-12 18:59:16 -0400180 (
181 while read x && test -n "$x"
182 do
183 :;
184 done
185 cat
186 ) <bundle3 >bundle.pack &&
Johannes Schindelin18449ab2007-03-08 00:43:05 +0100187 git index-pack bundle.pack &&
Junio C Hamano2e674a92009-08-07 20:12:13 -0700188 test_bundle_object_count bundle.pack 3
Johannes Schindelin18449ab2007-03-08 00:43:05 +0100189'
190
Junio C Hamano7fa82542007-08-08 17:01:49 -0700191test_expect_success 'bundle should be able to create a full history' '
192
193 cd "$D" &&
194 git tag -a -m '1.0' v1.0 master &&
195 git bundle create bundle4 v1.0
196
197'
198
Johannes Schindelin7efaeba2009-03-09 19:44:55 +0100199! rsync --help > /dev/null 2> /dev/null &&
200say 'Skipping rsync tests because rsync was not found' || {
Johannes Schindelincd547b42007-10-01 00:59:39 +0100201test_expect_success 'fetch via rsync' '
202 git pack-refs &&
203 mkdir rsynced &&
Johannes Schindelin7efaeba2009-03-09 19:44:55 +0100204 (cd rsynced &&
205 git init --bare &&
206 git fetch "rsync:$(pwd)/../.git" master:refs/heads/master &&
207 git gc --prune &&
208 test $(git rev-parse master) = $(cd .. && git rev-parse master) &&
209 git fsck --full)
Johannes Schindelincd547b42007-10-01 00:59:39 +0100210'
211
212test_expect_success 'push via rsync' '
Johannes Schindelin7efaeba2009-03-09 19:44:55 +0100213 mkdir rsynced2 &&
214 (cd rsynced2 &&
Johannes Schindelincd547b42007-10-01 00:59:39 +0100215 git init) &&
Johannes Schindelin7efaeba2009-03-09 19:44:55 +0100216 (cd rsynced &&
217 git push "rsync:$(pwd)/../rsynced2/.git" master) &&
218 (cd rsynced2 &&
219 git gc --prune &&
220 test $(git rev-parse master) = $(cd .. && git rev-parse master) &&
221 git fsck --full)
Johannes Schindelincd547b42007-10-01 00:59:39 +0100222'
223
224test_expect_success 'push via rsync' '
Johannes Schindelincd547b42007-10-01 00:59:39 +0100225 mkdir rsynced3 &&
226 (cd rsynced3 &&
227 git init) &&
Johannes Schindelin7efaeba2009-03-09 19:44:55 +0100228 git push --all "rsync:$(pwd)/rsynced3/.git" &&
229 (cd rsynced3 &&
230 test $(git rev-parse master) = $(cd .. && git rev-parse master) &&
231 git fsck --full)
Johannes Schindelincd547b42007-10-01 00:59:39 +0100232'
233}
234
Johannes Schindelinda0204d2007-10-11 01:47:55 +0100235test_expect_success 'fetch with a non-applying branch.<name>.merge' '
236 git config branch.master.remote yeti &&
237 git config branch.master.merge refs/heads/bigfoot &&
238 git config remote.blub.url one &&
239 git config remote.blub.fetch "refs/heads/*:refs/remotes/one/*" &&
240 git fetch blub
241'
242
Johannes Sixtc2015b32007-11-04 21:26:22 +0100243# the strange name is: a\!'b
244test_expect_success 'quoting of a strangely named repo' '
Stephan Beyerd492b312008-07-12 17:47:52 +0200245 test_must_fail git fetch "a\\!'\''b" > result 2>&1 &&
Johannes Sixtc2015b32007-11-04 21:26:22 +0100246 cat result &&
247 grep "fatal: '\''a\\\\!'\''b'\''" result
248'
249
Johannes Schindelinc5546e82007-11-22 12:24:59 +0000250test_expect_success 'bundle should record HEAD correctly' '
251
252 cd "$D" &&
253 git bundle create bundle5 HEAD master &&
254 git bundle list-heads bundle5 >actual &&
255 for h in HEAD refs/heads/master
256 do
257 echo "$(git rev-parse --verify $h) $h"
258 done >expect &&
Jeff King82ebb0b2008-03-12 17:36:36 -0400259 test_cmp expect actual
Johannes Schindelinc5546e82007-11-22 12:24:59 +0000260
261'
262
Junio C Hamanoc7015962007-12-04 21:58:42 -0800263test_expect_success 'explicit fetch should not update tracking' '
264
265 cd "$D" &&
266 git branch -f side &&
267 (
268 cd three &&
269 o=$(git rev-parse --verify refs/remotes/origin/master) &&
270 git fetch origin master &&
271 n=$(git rev-parse --verify refs/remotes/origin/master) &&
272 test "$o" = "$n" &&
Stephan Beyerd492b312008-07-12 17:47:52 +0200273 test_must_fail git rev-parse --verify refs/remotes/origin/side
Junio C Hamanoc7015962007-12-04 21:58:42 -0800274 )
275'
276
277test_expect_success 'explicit pull should not update tracking' '
278
279 cd "$D" &&
280 git branch -f side &&
281 (
282 cd three &&
283 o=$(git rev-parse --verify refs/remotes/origin/master) &&
284 git pull origin master &&
285 n=$(git rev-parse --verify refs/remotes/origin/master) &&
286 test "$o" = "$n" &&
Stephan Beyerd492b312008-07-12 17:47:52 +0200287 test_must_fail git rev-parse --verify refs/remotes/origin/side
Junio C Hamanoc7015962007-12-04 21:58:42 -0800288 )
289'
290
291test_expect_success 'configured fetch updates tracking' '
292
293 cd "$D" &&
294 git branch -f side &&
295 (
296 cd three &&
297 o=$(git rev-parse --verify refs/remotes/origin/master) &&
298 git fetch origin &&
299 n=$(git rev-parse --verify refs/remotes/origin/master) &&
300 test "$o" != "$n" &&
301 git rev-parse --verify refs/remotes/origin/side
302 )
303'
304
Jeff King9a7bbd12008-06-16 12:15:02 -0400305test_expect_success 'pushing nonexistent branch by mistake should not segv' '
306
307 cd "$D" &&
308 test_must_fail git push seven no:no
309
310'
311
Junio C Hamano49420252008-09-21 23:50:01 -0700312test_expect_success 'auto tag following fetches minimum' '
313
314 cd "$D" &&
315 git clone .git follow &&
316 git checkout HEAD^0 &&
317 (
318 for i in 1 2 3 4 5 6 7
319 do
320 echo $i >>file &&
321 git commit -m $i -a &&
322 git tag -a -m $i excess-$i || exit 1
323 done
324 ) &&
325 git checkout master &&
326 (
327 cd follow &&
328 git fetch
329 )
330'
331
Johannes Schindelin8ee5d732008-10-13 11:36:52 +0200332test_expect_success 'refuse to fetch into the current branch' '
333
334 test_must_fail git fetch . side:master
335
336'
337
338test_expect_success 'fetch into the current branch with --update-head-ok' '
339
340 git fetch --update-head-ok . side:master
341
342'
343
Junio C Hamano7be1d622006-09-23 03:40:17 -0700344test_done