Code

t1510: setup case #4
[git.git] / t / t1510-repo-setup.sh
1 #!/bin/sh
3 test_description='Tests of cwd/prefix/worktree/gitdir setup in all cases'
5 . ./test-lib.sh
7 #
8 # A few rules for repo setup:
9 #
10 # 1. GIT_DIR is relative to user's cwd. --git-dir is equivalent to
11 #    GIT_DIR.
12 #
13 # 2. .git file is relative to parent directory. .git file is basically
14 #    symlink in disguise. The directory where .git file points to will
15 #    become new git_dir.
16 #
17 # 3. core.worktree is relative to git_dir.
18 #
19 # 4. GIT_WORK_TREE is relative to user's cwd. --work-tree is
20 #    equivalent to GIT_WORK_TREE.
21 #
22 # 5. GIT_WORK_TREE/core.worktree is only effective if GIT_DIR is set
23 #    Uneffective worktree settings should be warned.
24 #
25 # 6. Effective GIT_WORK_TREE overrides core.worktree and core.bare
26 #
27 # 7. Effective core.worktree conflicts with core.bare
28 #
29 # 8. If GIT_DIR is set but neither worktree nor bare setting is given,
30 #    original cwd becomes worktree.
31 #
32 # 9. If .git discovery is done inside a repo, the repo becomes a bare
33 #    repo. .git discovery is performed if GIT_DIR is not set.
34 #
35 # 10. If no worktree is available, cwd remains unchanged, prefix is
36 #     NULL.
37 #
38 # 11. When user's cwd is outside worktree, cwd remains unchanged,
39 #     prefix is NULL.
40 #
42 test_repo() {
43         (
44         cd "$1" &&
45         if test -n "$2"; then GIT_DIR="$2" && export GIT_DIR; fi &&
46         if test -n "$3"; then GIT_WORK_TREE="$3" && export GIT_WORK_TREE; fi &&
47         rm -f trace &&
48         GIT_TRACE="`pwd`/trace" git symbolic-ref HEAD >/dev/null &&
49         grep '^setup: ' trace >result &&
50         test_cmp expected result
51         )
52 }
54 # Bit 0 = GIT_WORK_TREE
55 # Bit 1 = GIT_DIR
56 # Bit 2 = core.worktree
57 # Bit 3 = .git is a file
58 # Bit 4 = bare repo
59 # Case# = encoding of the above 5 bits
61 #
62 # Case #0
63 #
64 ############################################################
65 #
66 # Input:
67 #
68 #  - GIT_WORK_TREE is not set
69 #  - GIT_DIR is not set
70 #  - core.worktree is not set
71 #  - .git is a directory
72 #  - core.bare is not set, cwd is outside .git
73 #
74 # Output:
75 #
76 #  - worktree is .git's parent directory
77 #  - cwd is at worktree root dir
78 #  - prefix is calculated
79 #  - git_dir is set to ".git"
80 #  - cwd can't be outside worktree
82 test_expect_success '#0: setup' '
83         unset GIT_DIR GIT_WORK_TREE &&
84         mkdir 0 0/sub &&
85         cd 0 && git init && cd ..
86 '
88 test_expect_success '#0: at root' '
89         cat >0/expected <<EOF &&
90 setup: git_dir: .git
91 setup: worktree: $TRASH_DIRECTORY/0
92 setup: cwd: $TRASH_DIRECTORY/0
93 setup: prefix: (null)
94 EOF
95         test_repo 0
96 '
98 test_expect_success '#0: in subdir' '
99         cat >0/sub/expected <<EOF &&
100 setup: git_dir: .git
101 setup: worktree: $TRASH_DIRECTORY/0
102 setup: cwd: $TRASH_DIRECTORY/0
103 setup: prefix: sub/
104 EOF
105         test_repo 0/sub
109 # case #1
111 ############################################################
113 # Input:
115 #  - GIT_WORK_TREE is set
116 #  - GIT_DIR is not set
117 #  - core.worktree is not set
118 #  - .git is a directory
119 #  - core.bare is not set, cwd is outside .git
121 # Output:
123 # GIT_WORK_TREE is ignored -> #0
125 test_expect_success '#1: setup' '
126         unset GIT_DIR GIT_WORK_TREE &&
127         mkdir 1 1/sub 1.wt 1.wt/sub 1/wt 1/wt/sub &&
128         cd 1 &&
129         git init &&
130         GIT_WORK_TREE=non-existent &&
131         export GIT_WORK_TREE &&
132         cd ..
135 test_expect_failure '#1: at root' '
136         cat >1/expected <<EOF &&
137 setup: git_dir: .git
138 setup: worktree: $TRASH_DIRECTORY/1
139 setup: cwd: $TRASH_DIRECTORY/1
140 setup: prefix: (null)
141 EOF
142         test_repo 1
145 test_expect_failure '#1: in subdir' '
146         cat >1/sub/expected <<EOF &&
147 setup: git_dir: .git
148 setup: worktree: $TRASH_DIRECTORY/1
149 setup: cwd: $TRASH_DIRECTORY/1
150 setup: prefix: sub/
151 EOF
152         test_repo 1/sub
156 # case #2
158 ############################################################
160 # Input:
162 #  - GIT_WORK_TREE is not set
163 #  - GIT_DIR is set
164 #  - core.worktree is not set
165 #  - .git is a directory
166 #  - core.bare is not set, cwd is outside .git
168 # Output:
170 #  - worktree is at original cwd
171 #  - cwd is unchanged
172 #  - prefix is NULL
173 #  - git_dir is set to $GIT_DIR
174 #  - cwd can't be outside worktree
176 test_expect_success '#2: setup' '
177         unset GIT_DIR GIT_WORK_TREE &&
178         mkdir 2 2/sub &&
179         cd 2 && git init && cd ..
182 test_expect_success '#2: at root' '
183         cat >2/expected <<EOF &&
184 setup: git_dir: $TRASH_DIRECTORY/2/.git
185 setup: worktree: $TRASH_DIRECTORY/2
186 setup: cwd: $TRASH_DIRECTORY/2
187 setup: prefix: (null)
188 EOF
189         test_repo 2 "$TRASH_DIRECTORY/2/.git"
192 test_expect_success '#2: in subdir' '
193         cat >2/sub/expected <<EOF &&
194 setup: git_dir: $TRASH_DIRECTORY/2/.git
195 setup: worktree: $TRASH_DIRECTORY/2/sub
196 setup: cwd: $TRASH_DIRECTORY/2/sub
197 setup: prefix: (null)
198 EOF
199         test_repo 2/sub "$TRASH_DIRECTORY/2/.git"
202 test_expect_success '#2: relative GIT_DIR at root' '
203         cat >2/expected <<EOF &&
204 setup: git_dir: .git
205 setup: worktree: $TRASH_DIRECTORY/2
206 setup: cwd: $TRASH_DIRECTORY/2
207 setup: prefix: (null)
208 EOF
209         test_repo 2 .git
212 test_expect_success '#2: relative GIT_DIR in subdir' '
213         cat >2/sub/expected <<EOF &&
214 setup: git_dir: ../.git
215 setup: worktree: $TRASH_DIRECTORY/2/sub
216 setup: cwd: $TRASH_DIRECTORY/2/sub
217 setup: prefix: (null)
218 EOF
219         test_repo 2/sub ../.git
223 # case #3
225 ############################################################
227 # Input:
229 #  - GIT_WORK_TREE is set
230 #  - GIT_DIR is set
231 #  - core.worktree is not set
232 #  - .git is a directory
233 #  - core.bare is not set, cwd is outside .git
235 # Output:
237 #  - worktree is set to $GIT_WORK_TREE
238 #  - cwd is at worktree root
239 #  - prefix is calculated
240 #  - git_dir is set to $GIT_DIR
241 #  - cwd can be outside worktree
243 test_expect_success '#3: setup' '
244         unset GIT_DIR GIT_WORK_TREE &&
245         mkdir 3 3/sub 3/sub/sub 3.wt 3.wt/sub 3/wt 3/wt/sub &&
246         cd 3 && git init && cd ..
249 test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=root at root' '
250         cat >3/expected <<EOF &&
251 setup: git_dir: .git
252 setup: worktree: $TRASH_DIRECTORY/3
253 setup: cwd: $TRASH_DIRECTORY/3
254 setup: prefix: (null)
255 EOF
256         test_repo 3 .git "$TRASH_DIRECTORY/3"
259 test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' '
260         cat >3/expected <<EOF &&
261 setup: git_dir: .git
262 setup: worktree: $TRASH_DIRECTORY/3
263 setup: cwd: $TRASH_DIRECTORY/3
264 setup: prefix: (null)
265 EOF
266         test_repo 3 .git .
269 test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=root at root' '
270         cat >3/expected <<EOF &&
271 setup: git_dir: $TRASH_DIRECTORY/3/.git
272 setup: worktree: $TRASH_DIRECTORY/3
273 setup: cwd: $TRASH_DIRECTORY/3
274 setup: prefix: (null)
275 EOF
276         test_repo 3 "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY/3"
279 test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=root(rel) at root' '
280         cat >3/expected <<EOF &&
281 setup: git_dir: $TRASH_DIRECTORY/3/.git
282 setup: worktree: $TRASH_DIRECTORY/3
283 setup: cwd: $TRASH_DIRECTORY/3
284 setup: prefix: (null)
285 EOF
286         test_repo 3 "$TRASH_DIRECTORY/3/.git" .
289 test_expect_success '#3: GIT_DIR(rel), GIT_WORKTREE=root in subdir' '
290         cat >3/sub/sub/expected <<EOF &&
291 setup: git_dir: $TRASH_DIRECTORY/3/.git
292 setup: worktree: $TRASH_DIRECTORY/3
293 setup: cwd: $TRASH_DIRECTORY/3
294 setup: prefix: sub/sub/
295 EOF
296         test_repo 3/sub/sub ../../.git "$TRASH_DIRECTORY/3"
299 test_expect_success '#3: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' '
300         cat >3/sub/sub/expected <<EOF &&
301 setup: git_dir: $TRASH_DIRECTORY/3/.git
302 setup: worktree: $TRASH_DIRECTORY/3
303 setup: cwd: $TRASH_DIRECTORY/3
304 setup: prefix: sub/sub/
305 EOF
306         test_repo 3/sub/sub ../../.git ../..
309 test_expect_success '#3: GIT_DIR, GIT_WORKTREE=root in subdir' '
310         cat >3/sub/expected <<EOF &&
311 setup: git_dir: $TRASH_DIRECTORY/3/.git
312 setup: worktree: $TRASH_DIRECTORY/3
313 setup: cwd: $TRASH_DIRECTORY/3
314 setup: prefix: sub/
315 EOF
316         test_repo 3/sub "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY/3"
319 test_expect_success '#3: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' '
320         cat >3/sub/sub/expected <<EOF &&
321 setup: git_dir: $TRASH_DIRECTORY/3/.git
322 setup: worktree: $TRASH_DIRECTORY/3
323 setup: cwd: $TRASH_DIRECTORY/3
324 setup: prefix: sub/sub/
325 EOF
326         test_repo 3/sub/sub "$TRASH_DIRECTORY/3/.git" ../..
329 test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=wt at root' '
330         cat >3/expected <<EOF &&
331 setup: git_dir: .git
332 setup: worktree: $TRASH_DIRECTORY/3/wt
333 setup: cwd: $TRASH_DIRECTORY/3
334 setup: prefix: (null)
335 EOF
336         test_repo 3 .git "$TRASH_DIRECTORY/3/wt"
339 test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' '
340         cat >3/expected <<EOF &&
341 setup: git_dir: .git
342 setup: worktree: $TRASH_DIRECTORY/3/wt
343 setup: cwd: $TRASH_DIRECTORY/3
344 setup: prefix: (null)
345 EOF
346         test_repo 3 .git wt
349 test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' '
350         cat >3/expected <<EOF &&
351 setup: git_dir: $TRASH_DIRECTORY/3/.git
352 setup: worktree: $TRASH_DIRECTORY/3/wt
353 setup: cwd: $TRASH_DIRECTORY/3
354 setup: prefix: (null)
355 EOF
356         test_repo 3 "$TRASH_DIRECTORY/3/.git" wt
359 test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=wt at root' '
360         cat >3/expected <<EOF &&
361 setup: git_dir: $TRASH_DIRECTORY/3/.git
362 setup: worktree: $TRASH_DIRECTORY/3/wt
363 setup: cwd: $TRASH_DIRECTORY/3
364 setup: prefix: (null)
365 EOF
366         test_repo 3 "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY/3/wt"
369 test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' '
370         cat >3/sub/sub/expected <<EOF &&
371 setup: git_dir: ../../.git
372 setup: worktree: $TRASH_DIRECTORY/3/wt
373 setup: cwd: $TRASH_DIRECTORY/3/sub/sub
374 setup: prefix: (null)
375 EOF
376         test_repo 3/sub/sub ../../.git "$TRASH_DIRECTORY/3/wt"
379 test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' '
380         cat >3/sub/sub/expected <<EOF &&
381 setup: git_dir: ../../.git
382 setup: worktree: $TRASH_DIRECTORY/3/wt
383 setup: cwd: $TRASH_DIRECTORY/3/sub/sub
384 setup: prefix: (null)
385 EOF
386         test_repo 3/sub/sub ../../.git ../../wt
389 test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' '
390         cat >3/sub/sub/expected <<EOF &&
391 setup: git_dir: $TRASH_DIRECTORY/3/.git
392 setup: worktree: $TRASH_DIRECTORY/3/wt
393 setup: cwd: $TRASH_DIRECTORY/3/sub/sub
394 setup: prefix: (null)
395 EOF
396         test_repo 3/sub/sub "$TRASH_DIRECTORY/3/.git" ../../wt
399 test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=wt in subdir' '
400         cat >3/sub/sub/expected <<EOF &&
401 setup: git_dir: $TRASH_DIRECTORY/3/.git
402 setup: worktree: $TRASH_DIRECTORY/3/wt
403 setup: cwd: $TRASH_DIRECTORY/3/sub/sub
404 setup: prefix: (null)
405 EOF
406         test_repo 3/sub/sub "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY/3/wt"
409 test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=.. at root' '
410         cat >3/expected <<EOF &&
411 setup: git_dir: $TRASH_DIRECTORY/3/.git
412 setup: worktree: $TRASH_DIRECTORY
413 setup: cwd: $TRASH_DIRECTORY
414 setup: prefix: 3/
415 EOF
416         test_repo 3 .git "$TRASH_DIRECTORY"
419 test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' '
420         cat >3/expected <<EOF &&
421 setup: git_dir: $TRASH_DIRECTORY/3/.git
422 setup: worktree: $TRASH_DIRECTORY
423 setup: cwd: $TRASH_DIRECTORY
424 setup: prefix: 3/
425 EOF
426         test_repo 3 .git ..
429 test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=..(rel) at root' '
430         cat >3/expected <<EOF &&
431 setup: git_dir: $TRASH_DIRECTORY/3/.git
432 setup: worktree: $TRASH_DIRECTORY
433 setup: cwd: $TRASH_DIRECTORY
434 setup: prefix: 3/
435 EOF
436         test_repo 3 "$TRASH_DIRECTORY/3/.git" ..
439 test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=.. at root' '
440         cat >3/expected <<EOF &&
441 setup: git_dir: $TRASH_DIRECTORY/3/.git
442 setup: worktree: $TRASH_DIRECTORY
443 setup: cwd: $TRASH_DIRECTORY
444 setup: prefix: 3/
445 EOF
446         test_repo 3 "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY"
449 test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' '
450         cat >3/sub/sub/expected <<EOF &&
451 setup: git_dir: $TRASH_DIRECTORY/3/.git
452 setup: worktree: $TRASH_DIRECTORY
453 setup: cwd: $TRASH_DIRECTORY
454 setup: prefix: 3/sub/sub/
455 EOF
456         test_repo 3/sub/sub ../../.git "$TRASH_DIRECTORY"
459 test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' '
460         cat >3/sub/sub/expected <<EOF &&
461 setup: git_dir: $TRASH_DIRECTORY/3/.git
462 setup: worktree: $TRASH_DIRECTORY
463 setup: cwd: $TRASH_DIRECTORY
464 setup: prefix: 3/sub/sub/
465 EOF
466         test_repo 3/sub/sub ../../.git ../../..
469 test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' '
470         cat >3/sub/sub/expected <<EOF &&
471 setup: git_dir: $TRASH_DIRECTORY/3/.git
472 setup: worktree: $TRASH_DIRECTORY
473 setup: cwd: $TRASH_DIRECTORY
474 setup: prefix: 3/sub/sub/
475 EOF
476         test_repo 3/sub/sub "$TRASH_DIRECTORY/3/.git" ../../../
479 test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=.. in subdir' '
480         cat >3/sub/sub/expected <<EOF &&
481 setup: git_dir: $TRASH_DIRECTORY/3/.git
482 setup: worktree: $TRASH_DIRECTORY
483 setup: cwd: $TRASH_DIRECTORY
484 setup: prefix: 3/sub/sub/
485 EOF
486         test_repo 3/sub/sub "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY"
490 # case #4
492 ############################################################
494 # Input:
496 #  - GIT_WORK_TREE is not set
497 #  - GIT_DIR is not set
498 #  - core.worktree is set
499 #  - .git is a directory
500 #  - core.bare is not set, cwd is outside .git
502 # Output:
504 # core.worktree is ignored -> #0
506 test_expect_success '#4: setup' '
507         unset GIT_DIR GIT_WORK_TREE &&
508         mkdir 4 4/sub &&
509         cd 4 &&
510         git init &&
511         git config core.worktree non-existent &&
512         cd ..
515 test_expect_failure '#4: at root' '
516         cat >4/expected <<EOF &&
517 setup: git_dir: .git
518 setup: worktree: $TRASH_DIRECTORY/4
519 setup: cwd: $TRASH_DIRECTORY/4
520 setup: prefix: (null)
521 EOF
522         test_repo 4
525 test_expect_failure '#4: in subdir' '
526         cat >4/sub/expected <<EOF &&
527 setup: git_dir: .git
528 setup: worktree: $TRASH_DIRECTORY/4
529 setup: cwd: $TRASH_DIRECTORY/4
530 setup: prefix: sub/
531 EOF
532         test_repo 4/sub
535 test_done