]>
Commit | Line | Data |
---|---|---|
a2b26acd JH |
1 | #!/bin/sh |
2 | ||
3 | test_description=clone | |
4 | ||
5 | . ./test-lib.sh | |
6 | ||
7 | test_expect_success setup ' | |
8 | ||
9 | rm -fr .git && | |
10 | test_create_repo src && | |
11 | ( | |
bafe7631 NTND |
12 | cd src && |
13 | >file && | |
14 | git add file && | |
7f08c685 NTND |
15 | git commit -m initial && |
16 | echo 1 >file && | |
17 | git add file && | |
18 | git commit -m updated | |
a2b26acd JH |
19 | ) |
20 | ||
21 | ' | |
22 | ||
1db4a75c | 23 | test_expect_success 'clone with excess parameters (1)' ' |
a2b26acd | 24 | |
1db4a75c SP |
25 | rm -fr dst && |
26 | test_must_fail git clone -n src dst junk | |
27 | ||
28 | ' | |
29 | ||
30 | test_expect_success 'clone with excess parameters (2)' ' | |
31 | ||
32 | rm -fr dst && | |
a2b26acd JH |
33 | test_must_fail git clone -n "file://$(pwd)/src" dst junk |
34 | ||
35 | ' | |
36 | ||
5cde5989 | 37 | test_expect_success C_LOCALE_OUTPUT 'output from clone' ' |
2c3766f0 | 38 | rm -fr dst && |
68b939b2 | 39 | git clone -n "file://$(pwd)/src" dst >output 2>&1 && |
28ba96ab | 40 | test $(grep Clon output | wc -l) = 1 |
2c3766f0 AM |
41 | ' |
42 | ||
1db4a75c SP |
43 | test_expect_success 'clone does not keep pack' ' |
44 | ||
45 | rm -fr dst && | |
46 | git clone -n "file://$(pwd)/src" dst && | |
47 | ! test -f dst/file && | |
48 | ! (echo dst/.git/objects/pack/pack-* | grep "\.keep") | |
49 | ||
50 | ' | |
51 | ||
a73bc127 JS |
52 | test_expect_success 'clone checks out files' ' |
53 | ||
1db4a75c | 54 | rm -fr dst && |
a73bc127 JS |
55 | git clone src dst && |
56 | test -f dst/file | |
57 | ||
58 | ' | |
59 | ||
2beebd22 JK |
60 | test_expect_success 'clone respects GIT_WORK_TREE' ' |
61 | ||
62 | GIT_WORK_TREE=worktree git clone src bare && | |
63 | test -f bare/config && | |
64 | test -f worktree/file | |
65 | ||
66 | ' | |
67 | ||
68 | test_expect_success 'clone creates intermediate directories' ' | |
69 | ||
70 | git clone src long/path/to/dst && | |
71 | test -f long/path/to/dst/file | |
72 | ||
73 | ' | |
74 | ||
75 | test_expect_success 'clone creates intermediate directories for bare repo' ' | |
76 | ||
77 | git clone --bare src long/path/to/bare/dst && | |
78 | test -f long/path/to/bare/dst/config | |
79 | ||
80 | ' | |
81 | ||
bc699afc JS |
82 | test_expect_success 'clone --mirror' ' |
83 | ||
84 | git clone --mirror src mirror && | |
85 | test -f mirror/HEAD && | |
86 | test ! -f mirror/file && | |
87 | FETCH="$(cd mirror && git config remote.origin.fetch)" && | |
88 | test "+refs/*:refs/*" = "$FETCH" && | |
89 | MIRROR="$(cd mirror && git config --bool remote.origin.mirror)" && | |
90 | test "$MIRROR" = true | |
91 | ||
92 | ' | |
93 | ||
7f08c685 NTND |
94 | test_expect_success 'clone --mirror with detached HEAD' ' |
95 | ||
96 | ( cd src && git checkout HEAD^ && git rev-parse HEAD >../expected ) && | |
97 | git clone --mirror src mirror.detached && | |
98 | ( cd src && git checkout - ) && | |
99 | GIT_DIR=mirror.detached git rev-parse HEAD >actual && | |
100 | test_cmp expected actual | |
101 | ||
102 | ' | |
103 | ||
104 | test_expect_success 'clone --bare with detached HEAD' ' | |
105 | ||
106 | ( cd src && git checkout HEAD^ && git rev-parse HEAD >../expected ) && | |
107 | git clone --bare src bare.detached && | |
108 | ( cd src && git checkout - ) && | |
109 | GIT_DIR=bare.detached git rev-parse HEAD >actual && | |
110 | test_cmp expected actual | |
111 | ||
112 | ' | |
113 | ||
6612f877 JS |
114 | test_expect_success 'clone --bare names the local repository <name>.git' ' |
115 | ||
116 | git clone --bare src && | |
117 | test -d src.git | |
118 | ||
119 | ' | |
120 | ||
468386a9 JS |
121 | test_expect_success 'clone --mirror does not repeat tags' ' |
122 | ||
123 | (cd src && | |
124 | git tag some-tag HEAD) && | |
125 | git clone --mirror src mirror2 && | |
126 | (cd mirror2 && | |
127 | git show-ref 2> clone.err > clone.out) && | |
128 | test_must_fail grep Duplicate mirror2/clone.err && | |
129 | grep some-tag mirror2/clone.out | |
130 | ||
131 | ' | |
132 | ||
44a68fd5 CB |
133 | test_expect_success 'clone to destination with trailing /' ' |
134 | ||
135 | git clone src target-1/ && | |
136 | T=$( cd target-1 && git rev-parse HEAD ) && | |
137 | S=$( cd src && git rev-parse HEAD ) && | |
138 | test "$T" = "$S" | |
139 | ||
140 | ' | |
141 | ||
142 | test_expect_success 'clone to destination with extra trailing /' ' | |
143 | ||
144 | git clone src target-2/// && | |
145 | T=$( cd target-2 && git rev-parse HEAD ) && | |
146 | S=$( cd src && git rev-parse HEAD ) && | |
147 | test "$T" = "$S" | |
148 | ||
149 | ' | |
150 | ||
55892d23 AP |
151 | test_expect_success 'clone to an existing empty directory' ' |
152 | mkdir target-3 && | |
153 | git clone src target-3 && | |
154 | T=$( cd target-3 && git rev-parse HEAD ) && | |
155 | S=$( cd src && git rev-parse HEAD ) && | |
156 | test "$T" = "$S" | |
157 | ' | |
158 | ||
159 | test_expect_success 'clone to an existing non-empty directory' ' | |
160 | mkdir target-4 && | |
161 | >target-4/Fakefile && | |
162 | test_must_fail git clone src target-4 | |
163 | ' | |
164 | ||
165 | test_expect_success 'clone to an existing path' ' | |
166 | >target-5 && | |
167 | test_must_fail git clone src target-5 | |
168 | ' | |
169 | ||
5cd12b85 JH |
170 | test_expect_success 'clone a void' ' |
171 | mkdir src-0 && | |
172 | ( | |
173 | cd src-0 && git init | |
174 | ) && | |
12d49966 JK |
175 | git clone "file://$(pwd)/src-0" target-6 2>err-6 && |
176 | ! grep "fatal:" err-6 && | |
5cd12b85 JH |
177 | ( |
178 | cd src-0 && test_commit A | |
179 | ) && | |
12d49966 JK |
180 | git clone "file://$(pwd)/src-0" target-7 2>err-7 && |
181 | ! grep "fatal:" err-7 && | |
5cd12b85 JH |
182 | # There is no reason to insist they are bit-for-bit |
183 | # identical, but this test should suffice for now. | |
184 | test_cmp target-6/.git/config target-7/.git/config | |
185 | ' | |
186 | ||
a9f2c136 JH |
187 | test_expect_success 'clone respects global branch.autosetuprebase' ' |
188 | ( | |
a9f2c136 | 189 | test_config="$HOME/.gitconfig" && |
a9f2c136 JH |
190 | git config -f "$test_config" branch.autosetuprebase remote && |
191 | rm -fr dst && | |
192 | git clone src dst && | |
193 | cd dst && | |
194 | actual="z$(git config branch.master.rebase)" && | |
195 | test ztrue = $actual | |
196 | ) | |
197 | ' | |
198 | ||
9d2e9420 JK |
199 | test_expect_success 'respect url-encoding of file://' ' |
200 | git init x+y && | |
730220de TR |
201 | git clone "file://$PWD/x+y" xy-url-1 && |
202 | git clone "file://$PWD/x%2By" xy-url-2 | |
203 | ' | |
204 | ||
205 | test_expect_success 'do not query-string-decode + in URLs' ' | |
206 | rm -rf x+y && | |
207 | git init "x y" && | |
208 | test_must_fail git clone "file://$PWD/x+y" xy-no-plus | |
9d2e9420 JK |
209 | ' |
210 | ||
211 | test_expect_success 'do not respect url-encoding of non-url path' ' | |
212 | git init x+y && | |
213 | test_must_fail git clone x%2By xy-regular && | |
214 | git clone x+y xy-regular | |
215 | ' | |
216 | ||
b57fb80a NTND |
217 | test_expect_success 'clone separate gitdir' ' |
218 | rm -rf dst && | |
219 | git clone --separate-git-dir realgitdir src dst && | |
b57fb80a NTND |
220 | test -d realgitdir/refs |
221 | ' | |
222 | ||
33d56fa0 | 223 | test_expect_success 'clone separate gitdir: output' ' |
2c050e01 ÆAB |
224 | echo "gitdir: `pwd`/realgitdir" >expected && |
225 | test_cmp expected dst/.git | |
226 | ' | |
227 | ||
9b0ebc72 NTND |
228 | test_expect_success 'clone from .git file' ' |
229 | git clone dst/.git dst2 | |
230 | ' | |
231 | ||
0c80fdb3 PH |
232 | test_expect_success 'fetch from .git gitfile' ' |
233 | ( | |
234 | cd dst2 && | |
235 | git fetch ../dst/.git | |
236 | ) | |
237 | ' | |
238 | ||
239 | test_expect_success 'fetch from gitfile parent' ' | |
240 | ( | |
241 | cd dst2 && | |
242 | git fetch ../dst | |
243 | ) | |
244 | ' | |
245 | ||
b57fb80a NTND |
246 | test_expect_success 'clone separate gitdir where target already exists' ' |
247 | rm -rf dst && | |
248 | test_must_fail git clone --separate-git-dir realgitdir src dst | |
249 | ' | |
250 | ||
e6baf4a1 | 251 | test_expect_success 'clone --reference from original' ' |
dbc92b07 JH |
252 | git clone --shared --bare src src-1 && |
253 | git clone --bare src src-2 && | |
254 | git clone --reference=src-2 --bare src-1 target-8 && | |
255 | grep /src-2/ target-8/objects/info/alternates | |
256 | ' | |
257 | ||
258 | test_expect_success 'clone with more than one --reference' ' | |
259 | git clone --bare src src-3 && | |
260 | git clone --bare src src-4 && | |
261 | git clone --reference=src-3 --reference=src-4 src target-9 && | |
262 | grep /src-3/ target-9/.git/objects/info/alternates && | |
263 | grep /src-4/ target-9/.git/objects/info/alternates | |
264 | ' | |
265 | ||
e6baf4a1 JH |
266 | test_expect_success 'clone from original with relative alternate' ' |
267 | mkdir nest && | |
268 | git clone --bare src nest/src-5 && | |
269 | echo ../../../src/.git/objects >nest/src-5/objects/info/alternates && | |
270 | git clone --bare nest/src-5 target-10 && | |
271 | grep /src/\\.git/objects target-10/objects/info/alternates | |
272 | ' | |
273 | ||
5a7d5b68 NTND |
274 | test_expect_success 'clone checking out a tag' ' |
275 | git clone --branch=some-tag src dst.tag && | |
276 | GIT_DIR=src/.git git rev-parse some-tag >expected && | |
277 | test_cmp expected dst.tag/.git/HEAD && | |
278 | GIT_DIR=dst.tag/.git git config remote.origin.fetch >fetch.actual && | |
279 | echo "+refs/heads/*:refs/remotes/origin/*" >fetch.expected && | |
280 | test_cmp fetch.expected fetch.actual | |
281 | ' | |
282 | ||
710eb3e2 TB |
283 | setup_ssh_wrapper () { |
284 | test_expect_success 'setup ssh wrapper' ' | |
285 | write_script "$TRASH_DIRECTORY/ssh-wrapper" <<-\EOF && | |
286 | echo >>"$TRASH_DIRECTORY/ssh-output" "ssh: $*" && | |
287 | # throw away all but the last argument, which should be the | |
288 | # command | |
289 | while test $# -gt 1; do shift; done | |
290 | eval "$1" | |
291 | EOF | |
292 | GIT_SSH="$TRASH_DIRECTORY/ssh-wrapper" && | |
293 | export GIT_SSH && | |
294 | export TRASH_DIRECTORY && | |
295 | >"$TRASH_DIRECTORY"/ssh-output | |
296 | ' | |
8d3d28f5 NTND |
297 | } |
298 | ||
299 | expect_ssh () { | |
710eb3e2 TB |
300 | test_when_finished ' |
301 | (cd "$TRASH_DIRECTORY" && rm -f ssh-expect && >ssh-output) | |
302 | ' && | |
8d3d28f5 NTND |
303 | { |
304 | case "$1" in | |
305 | none) | |
306 | ;; | |
307 | *) | |
308 | echo "ssh: $1 git-upload-pack '$2'" | |
309 | esac | |
310 | } >"$TRASH_DIRECTORY/ssh-expect" && | |
311 | (cd "$TRASH_DIRECTORY" && test_cmp ssh-expect ssh-output) | |
312 | } | |
313 | ||
710eb3e2 TB |
314 | setup_ssh_wrapper |
315 | ||
2171f3d2 | 316 | test_expect_success 'clone myhost:src uses ssh' ' |
8d3d28f5 NTND |
317 | git clone myhost:src ssh-clone && |
318 | expect_ssh myhost src | |
319 | ' | |
320 | ||
60003340 NTND |
321 | test_expect_success NOT_MINGW,NOT_CYGWIN 'clone local path foo:bar' ' |
322 | cp -R src "foo:bar" && | |
710eb3e2 | 323 | git clone "foo:bar" foobar && |
8d3d28f5 NTND |
324 | expect_ssh none |
325 | ' | |
326 | ||
327 | test_expect_success 'bracketed hostnames are still ssh' ' | |
8d3d28f5 NTND |
328 | git clone "[myhost:123]:src" ssh-bracket-clone && |
329 | expect_ssh myhost:123 src | |
60003340 NTND |
330 | ' |
331 | ||
2171f3d2 TB |
332 | counter=0 |
333 | # $1 url | |
334 | # $2 none|host | |
335 | # $3 path | |
336 | test_clone_url () { | |
337 | counter=$(($counter + 1)) | |
338 | test_might_fail git clone "$1" tmp$counter && | |
339 | expect_ssh "$2" "$3" | |
340 | } | |
341 | ||
342 | test_expect_success NOT_MINGW 'clone c:temp is ssl' ' | |
343 | test_clone_url c:temp c temp | |
344 | ' | |
345 | ||
346 | test_expect_success MINGW 'clone c:temp is dos drive' ' | |
347 | test_clone_url c:temp none | |
348 | ' | |
349 | ||
350 | #ip v4 | |
6a599748 | 351 | for repo in rep rep/home/project 123 |
2171f3d2 TB |
352 | do |
353 | test_expect_success "clone host:$repo" ' | |
354 | test_clone_url host:$repo host $repo | |
355 | ' | |
356 | done | |
357 | ||
358 | #ipv6 | |
2171f3d2 TB |
359 | for repo in rep rep/home/project 123 |
360 | do | |
361 | test_expect_success "clone [::1]:$repo" ' | |
362 | test_clone_url [::1]:$repo ::1 $repo | |
363 | ' | |
364 | done | |
c59ab2e5 TB |
365 | #home directory |
366 | test_expect_success "clone host:/~repo" ' | |
367 | test_clone_url host:/~repo host "~repo" | |
368 | ' | |
369 | ||
370 | test_expect_success "clone [::1]:/~repo" ' | |
371 | test_clone_url [::1]:/~repo ::1 "~repo" | |
372 | ' | |
2171f3d2 TB |
373 | |
374 | # Corner cases | |
83b05875 | 375 | for url in foo/bar:baz [foo]bar/baz:qux [foo/bar]:baz |
2171f3d2 TB |
376 | do |
377 | test_expect_success "clone $url is not ssh" ' | |
378 | test_clone_url $url none | |
379 | ' | |
380 | done | |
381 | ||
382 | #with ssh:// scheme | |
383 | test_expect_success 'clone ssh://host.xz/home/user/repo' ' | |
384 | test_clone_url "ssh://host.xz/home/user/repo" host.xz "/home/user/repo" | |
385 | ' | |
386 | ||
387 | # from home directory | |
388 | test_expect_success 'clone ssh://host.xz/~repo' ' | |
389 | test_clone_url "ssh://host.xz/~repo" host.xz "~repo" | |
390 | ' | |
391 | ||
392 | # with port number | |
393 | test_expect_success 'clone ssh://host.xz:22/home/user/repo' ' | |
394 | test_clone_url "ssh://host.xz:22/home/user/repo" "-p 22 host.xz" "/home/user/repo" | |
395 | ' | |
396 | ||
397 | # from home directory with port number | |
398 | test_expect_success 'clone ssh://host.xz:22/~repo' ' | |
399 | test_clone_url "ssh://host.xz:22/~repo" "-p 22 host.xz" "~repo" | |
400 | ' | |
401 | ||
402 | #IPv6 | |
403 | test_expect_success 'clone ssh://[::1]/home/user/repo' ' | |
404 | test_clone_url "ssh://[::1]/home/user/repo" "::1" "/home/user/repo" | |
405 | ' | |
406 | ||
407 | #IPv6 from home directory | |
408 | test_expect_success 'clone ssh://[::1]/~repo' ' | |
409 | test_clone_url "ssh://[::1]/~repo" "::1" "~repo" | |
410 | ' | |
411 | ||
412 | #IPv6 with port number | |
413 | test_expect_success 'clone ssh://[::1]:22/home/user/repo' ' | |
414 | test_clone_url "ssh://[::1]:22/home/user/repo" "-p 22 ::1" "/home/user/repo" | |
415 | ' | |
416 | ||
417 | #IPv6 from home directory with port number | |
418 | test_expect_success 'clone ssh://[::1]:22/~repo' ' | |
419 | test_clone_url "ssh://[::1]:22/~repo" "-p 22 ::1" "~repo" | |
420 | ' | |
421 | ||
8b277222 JH |
422 | test_expect_success 'clone from a repository with two identical branches' ' |
423 | ||
424 | ( | |
425 | cd src && | |
426 | git checkout -b another master | |
427 | ) && | |
428 | git clone src target-11 && | |
429 | test "z$( cd target-11 && git symbolic-ref HEAD )" = zrefs/heads/another | |
430 | ||
431 | ' | |
432 | ||
0d7d285f NTND |
433 | test_expect_success 'shallow clone locally' ' |
434 | git clone --depth=1 --no-local src ssrrcc && | |
435 | git clone ssrrcc ddsstt && | |
436 | test_cmp ssrrcc/.git/shallow ddsstt/.git/shallow && | |
437 | ( cd ddsstt && git fsck ) | |
438 | ' | |
439 | ||
a2b26acd | 440 | test_done |