]> Pileus Git - ~andy/git/blob - t/t1510-repo-setup.sh
t1510: setup case #13
[~andy/git] / t / t1510-repo-setup.sh
1 #!/bin/sh
2
3 test_description='Tests of cwd/prefix/worktree/gitdir setup in all cases'
4
5 . ./test-lib.sh
6
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 #
41
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 }
53
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
60
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
81
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 '
87
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 '
97
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
106 '
107
108 #
109 # case #1
110 #
111 ############################################################
112 #
113 # Input:
114 #
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
120 #
121 # Output:
122 #
123 # GIT_WORK_TREE is ignored -> #0
124
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 ..
133 '
134
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
143 '
144
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
153 '
154
155 #
156 # case #2
157 #
158 ############################################################
159 #
160 # Input:
161 #
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
167 #
168 # Output:
169 #
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
175
176 test_expect_success '#2: setup' '
177         unset GIT_DIR GIT_WORK_TREE &&
178         mkdir 2 2/sub &&
179         cd 2 && git init && cd ..
180 '
181
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"
190 '
191
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"
200 '
201
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
210 '
211
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
220 '
221
222 #
223 # case #3
224 #
225 ############################################################
226 #
227 # Input:
228 #
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
234 #
235 # Output:
236 #
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
242
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 ..
247 '
248
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"
257 '
258
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 .
267 '
268
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"
277 '
278
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" .
287 '
288
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"
297 '
298
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 ../..
307 '
308
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"
317 '
318
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" ../..
327 '
328
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"
337 '
338
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
347 '
348
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
357 '
358
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"
367 '
368
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"
377 '
378
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
387 '
388
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
397 '
398
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"
407 '
408
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"
417 '
418
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 ..
427 '
428
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" ..
437 '
438
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"
447 '
448
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"
457 '
458
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 ../../..
467 '
468
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" ../../../
477 '
478
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"
487 '
488
489 #
490 # case #4
491 #
492 ############################################################
493 #
494 # Input:
495 #
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
501 #
502 # Output:
503 #
504 # core.worktree is ignored -> #0
505
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 ..
513 '
514
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
523 '
524
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
533 '
534
535 #
536 # case #5
537 #
538 ############################################################
539 #
540 # Input:
541 #
542 #  - GIT_WORK_TREE is set
543 #  - GIT_DIR is not set
544 #  - core.worktree is set
545 #  - .git is a directory
546 #  - core.bare is not set, cwd is outside .git
547 #
548 # Output:
549 #
550 # GIT_WORK_TREE/core.worktree are ignored -> #0
551
552 test_expect_success '#5: setup' '
553         unset GIT_DIR GIT_WORK_TREE &&
554         mkdir 5 5/sub &&
555         cd 5 &&
556         git init &&
557         git config core.worktree non-existent &&
558         GIT_WORK_TREE=non-existent-too &&
559         export GIT_WORK_TREE &&
560         cd ..
561 '
562
563 test_expect_failure '#5: at root' '
564         cat >5/expected <<EOF &&
565 setup: git_dir: .git
566 setup: worktree: $TRASH_DIRECTORY/5
567 setup: cwd: $TRASH_DIRECTORY/5
568 setup: prefix: (null)
569 EOF
570         test_repo 5
571 '
572
573 test_expect_failure '#5: in subdir' '
574         cat >5/sub/expected <<EOF &&
575 setup: git_dir: .git
576 setup: worktree: $TRASH_DIRECTORY/5
577 setup: cwd: $TRASH_DIRECTORY/5
578 setup: prefix: sub/
579 EOF
580         test_repo 5/sub
581 '
582
583 #
584 # case #6
585 #
586 ############################################################
587 #
588 # Input:
589 #
590 #  - GIT_WORK_TREE is not set
591 #  - GIT_DIR is set
592 #  - core.worktree is set
593 #  - .git is a directory
594 #  - core.bare is not set, cwd is outside .git
595 #
596 # Output:
597 #
598 #  - worktree is at core.worktree
599 #  - cwd is at worktree root
600 #  - prefix is calculated
601 #  - git_dir is at $GIT_DIR
602 #  - cwd can be outside worktree
603
604 test_expect_success '#6: setup' '
605         unset GIT_DIR GIT_WORK_TREE &&
606         mkdir 6 6/sub 6/sub/sub 6.wt 6.wt/sub 6/wt 6/wt/sub &&
607         cd 6 && git init && cd ..
608 '
609
610 test_expect_success '#6: GIT_DIR(rel), core.worktree=.. at root' '
611         cat >6/expected <<EOF &&
612 setup: git_dir: .git
613 setup: worktree: $TRASH_DIRECTORY/6
614 setup: cwd: $TRASH_DIRECTORY/6
615 setup: prefix: (null)
616 EOF
617         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6" &&
618         test_repo 6 .git
619 '
620
621 test_expect_success '#6: GIT_DIR(rel), core.worktree=..(rel) at root' '
622         cat >6/expected <<EOF &&
623 setup: git_dir: .git
624 setup: worktree: $TRASH_DIRECTORY/6
625 setup: cwd: $TRASH_DIRECTORY/6
626 setup: prefix: (null)
627 EOF
628         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree .. &&
629         test_repo 6 .git
630 '
631
632 test_expect_success '#6: GIT_DIR, core.worktree=.. at root' '
633         cat >6/expected <<EOF &&
634 setup: git_dir: $TRASH_DIRECTORY/6/.git
635 setup: worktree: $TRASH_DIRECTORY/6
636 setup: cwd: $TRASH_DIRECTORY/6
637 setup: prefix: (null)
638 EOF
639         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6" &&
640         test_repo 6 "$TRASH_DIRECTORY/6/.git"
641 '
642
643 test_expect_success '#6: GIT_DIR, core.worktree=..(rel) at root' '
644         cat >6/expected <<EOF &&
645 setup: git_dir: $TRASH_DIRECTORY/6/.git
646 setup: worktree: $TRASH_DIRECTORY/6
647 setup: cwd: $TRASH_DIRECTORY/6
648 setup: prefix: (null)
649 EOF
650         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree .. &&
651         test_repo 6 "$TRASH_DIRECTORY/6/.git"
652 '
653
654 test_expect_failure '#6: GIT_DIR(rel), core.worktree=.. in subdir' '
655         cat >6/sub/sub/expected <<EOF &&
656 setup: git_dir: $TRASH_DIRECTORY/6/.git
657 setup: worktree: $TRASH_DIRECTORY/6
658 setup: cwd: $TRASH_DIRECTORY/6
659 setup: prefix: sub/sub/
660 EOF
661         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6" &&
662         test_repo 6/sub/sub ../../.git
663 '
664
665 test_expect_failure '#6: GIT_DIR(rel), core.worktree=..(rel) in subdir' '
666         cat >6/sub/sub/expected <<EOF &&
667 setup: git_dir: $TRASH_DIRECTORY/6/.git
668 setup: worktree: $TRASH_DIRECTORY/6
669 setup: cwd: $TRASH_DIRECTORY/6
670 setup: prefix: sub/sub/
671 EOF
672         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree .. &&
673         test_repo 6/sub/sub ../../.git
674 '
675
676 test_expect_success '#6: GIT_DIR, core.worktree=.. in subdir' '
677         cat >6/sub/expected <<EOF &&
678 setup: git_dir: $TRASH_DIRECTORY/6/.git
679 setup: worktree: $TRASH_DIRECTORY/6
680 setup: cwd: $TRASH_DIRECTORY/6
681 setup: prefix: sub/
682 EOF
683         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6" &&
684         test_repo 6/sub "$TRASH_DIRECTORY/6/.git"
685 '
686
687 test_expect_success '#6: GIT_DIR, core.worktree=..(rel) in subdir' '
688         cat >6/sub/sub/expected <<EOF &&
689 setup: git_dir: $TRASH_DIRECTORY/6/.git
690 setup: worktree: $TRASH_DIRECTORY/6
691 setup: cwd: $TRASH_DIRECTORY/6
692 setup: prefix: sub/sub/
693 EOF
694         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree .. &&
695         test_repo 6/sub/sub "$TRASH_DIRECTORY/6/.git"
696 '
697
698 test_expect_success '#6: GIT_DIR(rel), core.worktree=../wt at root' '
699         cat >6/expected <<EOF &&
700 setup: git_dir: .git
701 setup: worktree: $TRASH_DIRECTORY/6/wt
702 setup: cwd: $TRASH_DIRECTORY/6
703 setup: prefix: (null)
704 EOF
705         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6/wt" &&
706         test_repo 6 .git
707 '
708
709 test_expect_success '#6: GIT_DIR(rel), core.worktree=../wt(rel) at root' '
710         cat >6/expected <<EOF &&
711 setup: git_dir: .git
712 setup: worktree: $TRASH_DIRECTORY/6/wt
713 setup: cwd: $TRASH_DIRECTORY/6
714 setup: prefix: (null)
715 EOF
716         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../wt &&
717         test_repo 6 .git
718 '
719
720 test_expect_success '#6: GIT_DIR, core.worktree=../wt(rel) at root' '
721         cat >6/expected <<EOF &&
722 setup: git_dir: $TRASH_DIRECTORY/6/.git
723 setup: worktree: $TRASH_DIRECTORY/6/wt
724 setup: cwd: $TRASH_DIRECTORY/6
725 setup: prefix: (null)
726 EOF
727         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../wt &&
728         test_repo 6 "$TRASH_DIRECTORY/6/.git"
729 '
730
731 test_expect_success '#6: GIT_DIR, core.worktree=../wt at root' '
732         cat >6/expected <<EOF &&
733 setup: git_dir: $TRASH_DIRECTORY/6/.git
734 setup: worktree: $TRASH_DIRECTORY/6/wt
735 setup: cwd: $TRASH_DIRECTORY/6
736 setup: prefix: (null)
737 EOF
738         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6/wt" &&
739         test_repo 6 "$TRASH_DIRECTORY/6/.git"
740 '
741
742 test_expect_success '#6: GIT_DIR(rel), core.worktree=../wt in subdir' '
743         cat >6/sub/sub/expected <<EOF &&
744 setup: git_dir: ../../.git
745 setup: worktree: $TRASH_DIRECTORY/6/wt
746 setup: cwd: $TRASH_DIRECTORY/6/sub/sub
747 setup: prefix: (null)
748 EOF
749         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6/wt" &&
750         test_repo 6/sub/sub ../../.git
751 '
752
753 test_expect_success '#6: GIT_DIR(rel), core.worktree=../wt(rel) in subdir' '
754         cat >6/sub/sub/expected <<EOF &&
755 setup: git_dir: ../../.git
756 setup: worktree: $TRASH_DIRECTORY/6/wt
757 setup: cwd: $TRASH_DIRECTORY/6/sub/sub
758 setup: prefix: (null)
759 EOF
760         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../wt &&
761         test_repo 6/sub/sub ../../.git
762 '
763
764 test_expect_success '#6: GIT_DIR, core.worktree=../wt(rel) in subdir' '
765         cat >6/sub/sub/expected <<EOF &&
766 setup: git_dir: $TRASH_DIRECTORY/6/.git
767 setup: worktree: $TRASH_DIRECTORY/6/wt
768 setup: cwd: $TRASH_DIRECTORY/6/sub/sub
769 setup: prefix: (null)
770 EOF
771         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../wt &&
772         test_repo 6/sub/sub "$TRASH_DIRECTORY/6/.git"
773 '
774
775 test_expect_success '#6: GIT_DIR, core.worktree=../wt in subdir' '
776         cat >6/sub/sub/expected <<EOF &&
777 setup: git_dir: $TRASH_DIRECTORY/6/.git
778 setup: worktree: $TRASH_DIRECTORY/6/wt
779 setup: cwd: $TRASH_DIRECTORY/6/sub/sub
780 setup: prefix: (null)
781 EOF
782         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6/wt" &&
783         test_repo 6/sub/sub "$TRASH_DIRECTORY/6/.git"
784 '
785
786 test_expect_failure '#6: GIT_DIR(rel), core.worktree=../.. at root' '
787         cat >6/expected <<EOF &&
788 setup: git_dir: $TRASH_DIRECTORY/6/.git
789 setup: worktree: $TRASH_DIRECTORY
790 setup: cwd: $TRASH_DIRECTORY
791 setup: prefix: 6/
792 EOF
793         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY" &&
794         test_repo 6 .git
795 '
796
797 test_expect_failure '#6: GIT_DIR(rel), core.worktree=../..(rel) at root' '
798         cat >6/expected <<EOF &&
799 setup: git_dir: $TRASH_DIRECTORY/6/.git
800 setup: worktree: $TRASH_DIRECTORY
801 setup: cwd: $TRASH_DIRECTORY
802 setup: prefix: 6/
803 EOF
804         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../../ &&
805         test_repo 6 .git
806 '
807
808 test_expect_success '#6: GIT_DIR, core.worktree=../..(rel) at root' '
809         cat >6/expected <<EOF &&
810 setup: git_dir: $TRASH_DIRECTORY/6/.git
811 setup: worktree: $TRASH_DIRECTORY
812 setup: cwd: $TRASH_DIRECTORY
813 setup: prefix: 6/
814 EOF
815         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../../ &&
816         test_repo 6 "$TRASH_DIRECTORY/6/.git"
817 '
818
819 test_expect_success '#6: GIT_DIR, core.worktree=../.. at root' '
820         cat >6/expected <<EOF &&
821 setup: git_dir: $TRASH_DIRECTORY/6/.git
822 setup: worktree: $TRASH_DIRECTORY
823 setup: cwd: $TRASH_DIRECTORY
824 setup: prefix: 6/
825 EOF
826         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY" &&
827         test_repo 6 "$TRASH_DIRECTORY/6/.git"
828 '
829
830 test_expect_failure '#6: GIT_DIR(rel), core.worktree=../.. in subdir' '
831         cat >6/sub/sub/expected <<EOF &&
832 setup: git_dir: $TRASH_DIRECTORY/6/.git
833 setup: worktree: $TRASH_DIRECTORY
834 setup: cwd: $TRASH_DIRECTORY
835 setup: prefix: 6/sub/sub/
836 EOF
837         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY" &&
838         test_repo 6/sub/sub ../../.git
839 '
840
841 test_expect_failure '#6: GIT_DIR(rel), core.worktree=../..(rel) in subdir' '
842         cat >6/sub/sub/expected <<EOF &&
843 setup: git_dir: $TRASH_DIRECTORY/6/.git
844 setup: worktree: $TRASH_DIRECTORY
845 setup: cwd: $TRASH_DIRECTORY
846 setup: prefix: 6/sub/sub/
847 EOF
848         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../.. &&
849         test_repo 6/sub/sub ../../.git
850 '
851
852 test_expect_success '#6: GIT_DIR, core.worktree=../..(rel) in subdir' '
853         cat >6/sub/sub/expected <<EOF &&
854 setup: git_dir: $TRASH_DIRECTORY/6/.git
855 setup: worktree: $TRASH_DIRECTORY
856 setup: cwd: $TRASH_DIRECTORY
857 setup: prefix: 6/sub/sub/
858 EOF
859         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../.. &&
860         test_repo 6/sub/sub "$TRASH_DIRECTORY/6/.git"
861 '
862
863 test_expect_success '#6: GIT_DIR, core.worktree=../.. in subdir' '
864         cat >6/sub/sub/expected <<EOF &&
865 setup: git_dir: $TRASH_DIRECTORY/6/.git
866 setup: worktree: $TRASH_DIRECTORY
867 setup: cwd: $TRASH_DIRECTORY
868 setup: prefix: 6/sub/sub/
869 EOF
870         git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY" &&
871         test_repo 6/sub/sub "$TRASH_DIRECTORY/6/.git"
872 '
873
874 #
875 # case #7
876 #
877 ############################################################
878 #
879 # Input:
880 #
881 #  - GIT_WORK_TREE is set
882 #  - GIT_DIR is set
883 #  - core.worktree is set
884 #  - .git is a directory
885 #  - core.bare is not set, cwd is outside .git
886 #
887 # Output:
888 #
889 # core.worktree is overridden by GIT_WORK_TREE -> #3
890
891 test_expect_success '#7: setup' '
892         unset GIT_DIR GIT_WORK_TREE &&
893         mkdir 7 7/sub 7/sub/sub 7.wt 7.wt/sub 7/wt 7/wt/sub &&
894         cd 7 &&
895         git init &&
896         git config core.worktree non-existent &&
897         cd ..
898 '
899
900 test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=root at root' '
901         cat >7/expected <<EOF &&
902 setup: git_dir: .git
903 setup: worktree: $TRASH_DIRECTORY/7
904 setup: cwd: $TRASH_DIRECTORY/7
905 setup: prefix: (null)
906 EOF
907         test_repo 7 .git "$TRASH_DIRECTORY/7"
908 '
909
910 test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' '
911         cat >7/expected <<EOF &&
912 setup: git_dir: .git
913 setup: worktree: $TRASH_DIRECTORY/7
914 setup: cwd: $TRASH_DIRECTORY/7
915 setup: prefix: (null)
916 EOF
917         test_repo 7 .git .
918 '
919
920 test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=root at root' '
921         cat >7/expected <<EOF &&
922 setup: git_dir: $TRASH_DIRECTORY/7/.git
923 setup: worktree: $TRASH_DIRECTORY/7
924 setup: cwd: $TRASH_DIRECTORY/7
925 setup: prefix: (null)
926 EOF
927         test_repo 7 "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY/7"
928 '
929
930 test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=root(rel) at root' '
931         cat >7/expected <<EOF &&
932 setup: git_dir: $TRASH_DIRECTORY/7/.git
933 setup: worktree: $TRASH_DIRECTORY/7
934 setup: cwd: $TRASH_DIRECTORY/7
935 setup: prefix: (null)
936 EOF
937         test_repo 7 "$TRASH_DIRECTORY/7/.git" .
938 '
939
940 test_expect_success '#7: GIT_DIR(rel), GIT_WORKTREE=root in subdir' '
941         cat >7/sub/sub/expected <<EOF &&
942 setup: git_dir: $TRASH_DIRECTORY/7/.git
943 setup: worktree: $TRASH_DIRECTORY/7
944 setup: cwd: $TRASH_DIRECTORY/7
945 setup: prefix: sub/sub/
946 EOF
947         test_repo 7/sub/sub ../../.git "$TRASH_DIRECTORY/7"
948 '
949
950 test_expect_success '#7: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' '
951         cat >7/sub/sub/expected <<EOF &&
952 setup: git_dir: $TRASH_DIRECTORY/7/.git
953 setup: worktree: $TRASH_DIRECTORY/7
954 setup: cwd: $TRASH_DIRECTORY/7
955 setup: prefix: sub/sub/
956 EOF
957         test_repo 7/sub/sub ../../.git ../..
958 '
959
960 test_expect_success '#7: GIT_DIR, GIT_WORKTREE=root in subdir' '
961         cat >7/sub/expected <<EOF &&
962 setup: git_dir: $TRASH_DIRECTORY/7/.git
963 setup: worktree: $TRASH_DIRECTORY/7
964 setup: cwd: $TRASH_DIRECTORY/7
965 setup: prefix: sub/
966 EOF
967         test_repo 7/sub "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY/7"
968 '
969
970 test_expect_success '#7: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' '
971         cat >7/sub/sub/expected <<EOF &&
972 setup: git_dir: $TRASH_DIRECTORY/7/.git
973 setup: worktree: $TRASH_DIRECTORY/7
974 setup: cwd: $TRASH_DIRECTORY/7
975 setup: prefix: sub/sub/
976 EOF
977         test_repo 7/sub/sub "$TRASH_DIRECTORY/7/.git" ../..
978 '
979
980 test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=wt at root' '
981         cat >7/expected <<EOF &&
982 setup: git_dir: .git
983 setup: worktree: $TRASH_DIRECTORY/7/wt
984 setup: cwd: $TRASH_DIRECTORY/7
985 setup: prefix: (null)
986 EOF
987         test_repo 7 .git "$TRASH_DIRECTORY/7/wt"
988 '
989
990 test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' '
991         cat >7/expected <<EOF &&
992 setup: git_dir: .git
993 setup: worktree: $TRASH_DIRECTORY/7/wt
994 setup: cwd: $TRASH_DIRECTORY/7
995 setup: prefix: (null)
996 EOF
997         test_repo 7 .git wt
998 '
999
1000 test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' '
1001         cat >7/expected <<EOF &&
1002 setup: git_dir: $TRASH_DIRECTORY/7/.git
1003 setup: worktree: $TRASH_DIRECTORY/7/wt
1004 setup: cwd: $TRASH_DIRECTORY/7
1005 setup: prefix: (null)
1006 EOF
1007         test_repo 7 "$TRASH_DIRECTORY/7/.git" wt
1008 '
1009
1010 test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=wt at root' '
1011         cat >7/expected <<EOF &&
1012 setup: git_dir: $TRASH_DIRECTORY/7/.git
1013 setup: worktree: $TRASH_DIRECTORY/7/wt
1014 setup: cwd: $TRASH_DIRECTORY/7
1015 setup: prefix: (null)
1016 EOF
1017         test_repo 7 "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY/7/wt"
1018 '
1019
1020 test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' '
1021         cat >7/sub/sub/expected <<EOF &&
1022 setup: git_dir: ../../.git
1023 setup: worktree: $TRASH_DIRECTORY/7/wt
1024 setup: cwd: $TRASH_DIRECTORY/7/sub/sub
1025 setup: prefix: (null)
1026 EOF
1027         test_repo 7/sub/sub ../../.git "$TRASH_DIRECTORY/7/wt"
1028 '
1029
1030 test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' '
1031         cat >7/sub/sub/expected <<EOF &&
1032 setup: git_dir: ../../.git
1033 setup: worktree: $TRASH_DIRECTORY/7/wt
1034 setup: cwd: $TRASH_DIRECTORY/7/sub/sub
1035 setup: prefix: (null)
1036 EOF
1037         test_repo 7/sub/sub ../../.git ../../wt
1038 '
1039
1040 test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' '
1041         cat >7/sub/sub/expected <<EOF &&
1042 setup: git_dir: $TRASH_DIRECTORY/7/.git
1043 setup: worktree: $TRASH_DIRECTORY/7/wt
1044 setup: cwd: $TRASH_DIRECTORY/7/sub/sub
1045 setup: prefix: (null)
1046 EOF
1047         test_repo 7/sub/sub "$TRASH_DIRECTORY/7/.git" ../../wt
1048 '
1049
1050 test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=wt in subdir' '
1051         cat >7/sub/sub/expected <<EOF &&
1052 setup: git_dir: $TRASH_DIRECTORY/7/.git
1053 setup: worktree: $TRASH_DIRECTORY/7/wt
1054 setup: cwd: $TRASH_DIRECTORY/7/sub/sub
1055 setup: prefix: (null)
1056 EOF
1057         test_repo 7/sub/sub "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY/7/wt"
1058 '
1059
1060 test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=.. at root' '
1061         cat >7/expected <<EOF &&
1062 setup: git_dir: $TRASH_DIRECTORY/7/.git
1063 setup: worktree: $TRASH_DIRECTORY
1064 setup: cwd: $TRASH_DIRECTORY
1065 setup: prefix: 7/
1066 EOF
1067         test_repo 7 .git "$TRASH_DIRECTORY"
1068 '
1069
1070 test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' '
1071         cat >7/expected <<EOF &&
1072 setup: git_dir: $TRASH_DIRECTORY/7/.git
1073 setup: worktree: $TRASH_DIRECTORY
1074 setup: cwd: $TRASH_DIRECTORY
1075 setup: prefix: 7/
1076 EOF
1077         test_repo 7 .git ..
1078 '
1079
1080 test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=..(rel) at root' '
1081         cat >7/expected <<EOF &&
1082 setup: git_dir: $TRASH_DIRECTORY/7/.git
1083 setup: worktree: $TRASH_DIRECTORY
1084 setup: cwd: $TRASH_DIRECTORY
1085 setup: prefix: 7/
1086 EOF
1087         test_repo 7 "$TRASH_DIRECTORY/7/.git" ..
1088 '
1089
1090 test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=.. at root' '
1091         cat >7/expected <<EOF &&
1092 setup: git_dir: $TRASH_DIRECTORY/7/.git
1093 setup: worktree: $TRASH_DIRECTORY
1094 setup: cwd: $TRASH_DIRECTORY
1095 setup: prefix: 7/
1096 EOF
1097         test_repo 7 "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY"
1098 '
1099
1100 test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' '
1101         cat >7/sub/sub/expected <<EOF &&
1102 setup: git_dir: $TRASH_DIRECTORY/7/.git
1103 setup: worktree: $TRASH_DIRECTORY
1104 setup: cwd: $TRASH_DIRECTORY
1105 setup: prefix: 7/sub/sub/
1106 EOF
1107         test_repo 7/sub/sub ../../.git "$TRASH_DIRECTORY"
1108 '
1109
1110 test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' '
1111         cat >7/sub/sub/expected <<EOF &&
1112 setup: git_dir: $TRASH_DIRECTORY/7/.git
1113 setup: worktree: $TRASH_DIRECTORY
1114 setup: cwd: $TRASH_DIRECTORY
1115 setup: prefix: 7/sub/sub/
1116 EOF
1117         test_repo 7/sub/sub ../../.git ../../..
1118 '
1119
1120 test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' '
1121         cat >7/sub/sub/expected <<EOF &&
1122 setup: git_dir: $TRASH_DIRECTORY/7/.git
1123 setup: worktree: $TRASH_DIRECTORY
1124 setup: cwd: $TRASH_DIRECTORY
1125 setup: prefix: 7/sub/sub/
1126 EOF
1127         test_repo 7/sub/sub "$TRASH_DIRECTORY/7/.git" ../../../
1128 '
1129
1130 test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=.. in subdir' '
1131         cat >7/sub/sub/expected <<EOF &&
1132 setup: git_dir: $TRASH_DIRECTORY/7/.git
1133 setup: worktree: $TRASH_DIRECTORY
1134 setup: cwd: $TRASH_DIRECTORY
1135 setup: prefix: 7/sub/sub/
1136 EOF
1137         test_repo 7/sub/sub "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY"
1138 '
1139
1140 #
1141 # case #8
1142 #
1143 ############################################################
1144 #
1145 # Input:
1146 #
1147 #  - GIT_WORK_TREE is not set
1148 #  - GIT_DIR is not set
1149 #  - core.worktree is not set
1150 #  - .git is a file
1151 #  - core.bare is not set, cwd is outside .git
1152 #
1153 # Output:
1154 #
1155 # #0 except that git_dir is set by .git file
1156
1157 test_expect_success '#8: setup' '
1158         unset GIT_DIR GIT_WORK_TREE &&
1159         mkdir 8 8/sub &&
1160         cd 8 &&
1161         git init &&
1162         mv .git ../8.git &&
1163         echo gitdir: ../8.git >.git &&
1164         cd ..
1165 '
1166
1167 test_expect_success '#8: at root' '
1168         cat >8/expected <<EOF &&
1169 setup: git_dir: $TRASH_DIRECTORY/8.git
1170 setup: worktree: $TRASH_DIRECTORY/8
1171 setup: cwd: $TRASH_DIRECTORY/8
1172 setup: prefix: (null)
1173 EOF
1174         test_repo 8
1175 '
1176
1177 test_expect_success '#8: in subdir' '
1178         cat >8/sub/expected <<EOF &&
1179 setup: git_dir: $TRASH_DIRECTORY/8.git
1180 setup: worktree: $TRASH_DIRECTORY/8
1181 setup: cwd: $TRASH_DIRECTORY/8
1182 setup: prefix: sub/
1183 EOF
1184         test_repo 8/sub
1185 '
1186
1187 #
1188 # case #9
1189 #
1190 ############################################################
1191 #
1192 # Input:
1193 #
1194 #  - GIT_WORK_TREE is set
1195 #  - GIT_DIR is not set
1196 #  - core.worktree is not set
1197 #  - .git is a file
1198 #  - core.bare is not set, cwd is outside .git
1199 #
1200 # Output:
1201 #
1202 # #1 except that git_dir is set by .git file
1203
1204 test_expect_success '#9: setup' '
1205         unset GIT_DIR GIT_WORK_TREE &&
1206         mkdir 9 9/sub 9.wt 9.wt/sub 9/wt 9/wt/sub &&
1207         cd 9 &&
1208         git init &&
1209         mv .git ../9.git &&
1210         echo gitdir: ../9.git >.git &&
1211         GIT_WORK_TREE=non-existent &&
1212         export GIT_WORK_TREE &&
1213         cd ..
1214 '
1215
1216 test_expect_failure '#9: at root' '
1217         cat >9/expected <<EOF &&
1218 setup: git_dir: $TRASH_DIRECTORY/9.git
1219 setup: worktree: $TRASH_DIRECTORY/9
1220 setup: cwd: $TRASH_DIRECTORY/9
1221 setup: prefix: (null)
1222 EOF
1223         test_repo 9
1224 '
1225
1226 test_expect_failure '#9: in subdir' '
1227         cat >9/sub/expected <<EOF &&
1228 setup: git_dir: $TRASH_DIRECTORY/9.git
1229 setup: worktree: $TRASH_DIRECTORY/9
1230 setup: cwd: $TRASH_DIRECTORY/9
1231 setup: prefix: sub/
1232 EOF
1233         test_repo 9/sub
1234 '
1235
1236 #
1237 # case #10
1238 #
1239 ############################################################
1240 #
1241 # Input:
1242 #
1243 #  - GIT_WORK_TREE is not set
1244 #  - GIT_DIR is set
1245 #  - core.worktree is not set
1246 #  - .git is a file
1247 #  - core.bare is not set, cwd is outside .git
1248 #
1249 # Output:
1250 #
1251 # #2 except that git_dir is set by .git file
1252
1253 test_expect_success '#10: setup' '
1254         unset GIT_DIR GIT_WORK_TREE &&
1255         mkdir 10 10/sub &&
1256         cd 10 &&
1257         git init &&
1258         mv .git ../10.git &&
1259         echo gitdir: ../10.git >.git &&
1260         cd ..
1261 '
1262
1263 test_expect_failure '#10: at root' '
1264         cat >10/expected <<EOF &&
1265 setup: git_dir: $TRASH_DIRECTORY/10.git
1266 setup: worktree: $TRASH_DIRECTORY/10
1267 setup: cwd: $TRASH_DIRECTORY/10
1268 setup: prefix: (null)
1269 EOF
1270         test_repo 10 "$TRASH_DIRECTORY/10/.git"
1271 '
1272
1273 test_expect_failure '#10: in subdir' '
1274         cat >10/sub/expected <<EOF &&
1275 setup: git_dir: $TRASH_DIRECTORY/10.git
1276 setup: worktree: $TRASH_DIRECTORY/10/sub
1277 setup: cwd: $TRASH_DIRECTORY/10/sub
1278 setup: prefix: (null)
1279 EOF
1280         test_repo 10/sub "$TRASH_DIRECTORY/10/.git"
1281 '
1282
1283 test_expect_failure '#10: relative GIT_DIR at root' '
1284         cat >10/expected <<EOF &&
1285 setup: git_dir: $TRASH_DIRECTORY/10.git
1286 setup: worktree: $TRASH_DIRECTORY/10
1287 setup: cwd: $TRASH_DIRECTORY/10
1288 setup: prefix: (null)
1289 EOF
1290         test_repo 10 .git
1291 '
1292
1293 test_expect_failure '#10: relative GIT_DIR in subdir' '
1294         cat >10/sub/expected <<EOF &&
1295 setup: git_dir: $TRASH_DIRECTORY/10.git
1296 setup: worktree: $TRASH_DIRECTORY/10/sub
1297 setup: cwd: $TRASH_DIRECTORY/10/sub
1298 setup: prefix: (null)
1299 EOF
1300         test_repo 10/sub ../.git
1301 '
1302
1303 #
1304 # case #11
1305 #
1306 ############################################################
1307 #
1308 # Input:
1309 #
1310 #  - GIT_WORK_TREE is set
1311 #  - GIT_DIR is set
1312 #  - core.worktree is not set
1313 #  - .git is a file
1314 #  - core.bare is not set, cwd is outside .git
1315 #
1316 # Output:
1317 #
1318 # #3 except that git_dir is set by .git file
1319
1320 test_expect_success '#11: setup' '
1321         unset GIT_DIR GIT_WORK_TREE &&
1322         mkdir 11 11/sub 11/sub/sub 11.wt 11.wt/sub 11/wt 11/wt/sub &&
1323         cd 11 &&
1324         git init &&
1325         mv .git ../11.git &&
1326         echo gitdir: ../11.git >.git &&
1327         cd ..
1328 '
1329
1330 test_expect_failure '#11: GIT_DIR(rel), GIT_WORK_TREE=root at root' '
1331         cat >11/expected <<EOF &&
1332 setup: git_dir: $TRASH_DIRECTORY/11.git
1333 setup: worktree: $TRASH_DIRECTORY/11
1334 setup: cwd: $TRASH_DIRECTORY/11
1335 setup: prefix: (null)
1336 EOF
1337         test_repo 11 .git "$TRASH_DIRECTORY/11"
1338 '
1339
1340 test_expect_failure '#11: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' '
1341         cat >11/expected <<EOF &&
1342 setup: git_dir: $TRASH_DIRECTORY/11.git
1343 setup: worktree: $TRASH_DIRECTORY/11
1344 setup: cwd: $TRASH_DIRECTORY/11
1345 setup: prefix: (null)
1346 EOF
1347         test_repo 11 .git .
1348 '
1349
1350 test_expect_failure '#11: GIT_DIR, GIT_WORK_TREE=root at root' '
1351         cat >11/expected <<EOF &&
1352 setup: git_dir: $TRASH_DIRECTORY/11.git
1353 setup: worktree: $TRASH_DIRECTORY/11
1354 setup: cwd: $TRASH_DIRECTORY/11
1355 setup: prefix: (null)
1356 EOF
1357         test_repo 11 "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY/11"
1358 '
1359
1360 test_expect_failure '#11: GIT_DIR, GIT_WORK_TREE=root(rel) at root' '
1361         cat >11/expected <<EOF &&
1362 setup: git_dir: $TRASH_DIRECTORY/11.git
1363 setup: worktree: $TRASH_DIRECTORY/11
1364 setup: cwd: $TRASH_DIRECTORY/11
1365 setup: prefix: (null)
1366 EOF
1367         test_repo 11 "$TRASH_DIRECTORY/11/.git" .
1368 '
1369
1370 test_expect_failure '#11: GIT_DIR(rel), GIT_WORKTREE=root in subdir' '
1371         cat >11/sub/sub/expected <<EOF &&
1372 setup: git_dir: $TRASH_DIRECTORY/11.git
1373 setup: worktree: $TRASH_DIRECTORY/11
1374 setup: cwd: $TRASH_DIRECTORY/11
1375 setup: prefix: sub/sub/
1376 EOF
1377         test_repo 11/sub/sub ../../.git "$TRASH_DIRECTORY/11"
1378 '
1379
1380 test_expect_failure '#11: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' '
1381         cat >11/sub/sub/expected <<EOF &&
1382 setup: git_dir: $TRASH_DIRECTORY/11.git
1383 setup: worktree: $TRASH_DIRECTORY/11
1384 setup: cwd: $TRASH_DIRECTORY/11
1385 setup: prefix: sub/sub/
1386 EOF
1387         test_repo 11/sub/sub ../../.git ../..
1388 '
1389
1390 test_expect_failure '#11: GIT_DIR, GIT_WORKTREE=root in subdir' '
1391         cat >11/sub/expected <<EOF &&
1392 setup: git_dir: $TRASH_DIRECTORY/11.git
1393 setup: worktree: $TRASH_DIRECTORY/11
1394 setup: cwd: $TRASH_DIRECTORY/11
1395 setup: prefix: sub/
1396 EOF
1397         test_repo 11/sub "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY/11"
1398 '
1399
1400 test_expect_failure '#11: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' '
1401         cat >11/sub/sub/expected <<EOF &&
1402 setup: git_dir: $TRASH_DIRECTORY/11.git
1403 setup: worktree: $TRASH_DIRECTORY/11
1404 setup: cwd: $TRASH_DIRECTORY/11
1405 setup: prefix: sub/sub/
1406 EOF
1407         test_repo 11/sub/sub "$TRASH_DIRECTORY/11/.git" ../..
1408 '
1409
1410 test_expect_failure '#11: GIT_DIR(rel), GIT_WORK_TREE=wt at root' '
1411         cat >11/expected <<EOF &&
1412 setup: git_dir: $TRASH_DIRECTORY/11.git
1413 setup: worktree: $TRASH_DIRECTORY/11/wt
1414 setup: cwd: $TRASH_DIRECTORY/11
1415 setup: prefix: (null)
1416 EOF
1417         test_repo 11 .git "$TRASH_DIRECTORY/11/wt"
1418 '
1419
1420 test_expect_failure '#11: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' '
1421         cat >11/expected <<EOF &&
1422 setup: git_dir: $TRASH_DIRECTORY/11.git
1423 setup: worktree: $TRASH_DIRECTORY/11/wt
1424 setup: cwd: $TRASH_DIRECTORY/11
1425 setup: prefix: (null)
1426 EOF
1427         test_repo 11 .git wt
1428 '
1429
1430 test_expect_failure '#11: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' '
1431         cat >11/expected <<EOF &&
1432 setup: git_dir: $TRASH_DIRECTORY/11.git
1433 setup: worktree: $TRASH_DIRECTORY/11/wt
1434 setup: cwd: $TRASH_DIRECTORY/11
1435 setup: prefix: (null)
1436 EOF
1437         test_repo 11 "$TRASH_DIRECTORY/11/.git" wt
1438 '
1439
1440 test_expect_failure '#11: GIT_DIR, GIT_WORK_TREE=wt at root' '
1441         cat >11/expected <<EOF &&
1442 setup: git_dir: $TRASH_DIRECTORY/11.git
1443 setup: worktree: $TRASH_DIRECTORY/11/wt
1444 setup: cwd: $TRASH_DIRECTORY/11
1445 setup: prefix: (null)
1446 EOF
1447         test_repo 11 "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY/11/wt"
1448 '
1449
1450 test_expect_failure '#11: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' '
1451         cat >11/sub/sub/expected <<EOF &&
1452 setup: git_dir: $TRASH_DIRECTORY/11.git
1453 setup: worktree: $TRASH_DIRECTORY/11/wt
1454 setup: cwd: $TRASH_DIRECTORY/11/sub/sub
1455 setup: prefix: (null)
1456 EOF
1457         test_repo 11/sub/sub ../../.git "$TRASH_DIRECTORY/11/wt"
1458 '
1459
1460 test_expect_failure '#11: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' '
1461         cat >11/sub/sub/expected <<EOF &&
1462 setup: git_dir: $TRASH_DIRECTORY/11.git
1463 setup: worktree: $TRASH_DIRECTORY/11/wt
1464 setup: cwd: $TRASH_DIRECTORY/11/sub/sub
1465 setup: prefix: (null)
1466 EOF
1467         test_repo 11/sub/sub ../../.git ../../wt
1468 '
1469
1470 test_expect_failure '#11: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' '
1471         cat >11/sub/sub/expected <<EOF &&
1472 setup: git_dir: $TRASH_DIRECTORY/11.git
1473 setup: worktree: $TRASH_DIRECTORY/11/wt
1474 setup: cwd: $TRASH_DIRECTORY/11/sub/sub
1475 setup: prefix: (null)
1476 EOF
1477         test_repo 11/sub/sub "$TRASH_DIRECTORY/11/.git" ../../wt
1478 '
1479
1480 test_expect_failure '#11: GIT_DIR, GIT_WORK_TREE=wt in subdir' '
1481         cat >11/sub/sub/expected <<EOF &&
1482 setup: git_dir: $TRASH_DIRECTORY/11.git
1483 setup: worktree: $TRASH_DIRECTORY/11/wt
1484 setup: cwd: $TRASH_DIRECTORY/11/sub/sub
1485 setup: prefix: (null)
1486 EOF
1487         test_repo 11/sub/sub "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY/11/wt"
1488 '
1489
1490 test_expect_failure '#11: GIT_DIR(rel), GIT_WORK_TREE=.. at root' '
1491         cat >11/expected <<EOF &&
1492 setup: git_dir: $TRASH_DIRECTORY/11.git
1493 setup: worktree: $TRASH_DIRECTORY
1494 setup: cwd: $TRASH_DIRECTORY
1495 setup: prefix: 11/
1496 EOF
1497         test_repo 11 .git "$TRASH_DIRECTORY"
1498 '
1499
1500 test_expect_failure '#11: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' '
1501         cat >11/expected <<EOF &&
1502 setup: git_dir: $TRASH_DIRECTORY/11.git
1503 setup: worktree: $TRASH_DIRECTORY
1504 setup: cwd: $TRASH_DIRECTORY
1505 setup: prefix: 11/
1506 EOF
1507         test_repo 11 .git ..
1508 '
1509
1510 test_expect_failure '#11: GIT_DIR, GIT_WORK_TREE=..(rel) at root' '
1511         cat >11/expected <<EOF &&
1512 setup: git_dir: $TRASH_DIRECTORY/11.git
1513 setup: worktree: $TRASH_DIRECTORY
1514 setup: cwd: $TRASH_DIRECTORY
1515 setup: prefix: 11/
1516 EOF
1517         test_repo 11 "$TRASH_DIRECTORY/11/.git" ..
1518 '
1519
1520 test_expect_failure '#11: GIT_DIR, GIT_WORK_TREE=.. at root' '
1521         cat >11/expected <<EOF &&
1522 setup: git_dir: $TRASH_DIRECTORY/11.git
1523 setup: worktree: $TRASH_DIRECTORY
1524 setup: cwd: $TRASH_DIRECTORY
1525 setup: prefix: 11/
1526 EOF
1527         test_repo 11 "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY"
1528 '
1529
1530 test_expect_failure '#11: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' '
1531         cat >11/sub/sub/expected <<EOF &&
1532 setup: git_dir: $TRASH_DIRECTORY/11.git
1533 setup: worktree: $TRASH_DIRECTORY
1534 setup: cwd: $TRASH_DIRECTORY
1535 setup: prefix: 11/sub/sub/
1536 EOF
1537         test_repo 11/sub/sub ../../.git "$TRASH_DIRECTORY"
1538 '
1539
1540 test_expect_failure '#11: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' '
1541         cat >11/sub/sub/expected <<EOF &&
1542 setup: git_dir: $TRASH_DIRECTORY/11.git
1543 setup: worktree: $TRASH_DIRECTORY
1544 setup: cwd: $TRASH_DIRECTORY
1545 setup: prefix: 11/sub/sub/
1546 EOF
1547         test_repo 11/sub/sub ../../.git ../../..
1548 '
1549
1550 test_expect_failure '#11: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' '
1551         cat >11/sub/sub/expected <<EOF &&
1552 setup: git_dir: $TRASH_DIRECTORY/11.git
1553 setup: worktree: $TRASH_DIRECTORY
1554 setup: cwd: $TRASH_DIRECTORY
1555 setup: prefix: 11/sub/sub/
1556 EOF
1557         test_repo 11/sub/sub "$TRASH_DIRECTORY/11/.git" ../../../
1558 '
1559
1560 test_expect_failure '#11: GIT_DIR, GIT_WORK_TREE=.. in subdir' '
1561         cat >11/sub/sub/expected <<EOF &&
1562 setup: git_dir: $TRASH_DIRECTORY/11.git
1563 setup: worktree: $TRASH_DIRECTORY
1564 setup: cwd: $TRASH_DIRECTORY
1565 setup: prefix: 11/sub/sub/
1566 EOF
1567         test_repo 11/sub/sub "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY"
1568 '
1569
1570 #
1571 # case #12
1572 #
1573 ############################################################
1574 #
1575 # Input:
1576 #
1577 #  - GIT_WORK_TREE is not set
1578 #  - GIT_DIR is not set
1579 #  - core.worktree is set
1580 #  - .git is a file
1581 #  - core.bare is not set, cwd is outside .git
1582 #
1583 # Output:
1584 #
1585 # #4 except that git_dir is set by .git file
1586
1587
1588 test_expect_success '#12: setup' '
1589         unset GIT_DIR GIT_WORK_TREE &&
1590         mkdir 12 12/sub 12/sub/sub 12.wt 12.wt/sub 12/wt 12/wt/sub &&
1591         cd 12 &&
1592         git init &&
1593         git config core.worktree non-existent &&
1594         mv .git ../12.git &&
1595         echo gitdir: ../12.git >.git &&
1596         cd ..
1597 '
1598
1599 test_expect_failure '#12: at root' '
1600         cat >12/expected <<EOF &&
1601 setup: git_dir: $TRASH_DIRECTORY/12.git
1602 setup: worktree: $TRASH_DIRECTORY/12
1603 setup: cwd: $TRASH_DIRECTORY/12
1604 setup: prefix: (null)
1605 EOF
1606         test_repo 12
1607 '
1608
1609 test_expect_failure '#12: in subdir' '
1610         cat >12/sub/expected <<EOF &&
1611 setup: git_dir: $TRASH_DIRECTORY/12.git
1612 setup: worktree: $TRASH_DIRECTORY/12
1613 setup: cwd: $TRASH_DIRECTORY/12
1614 setup: prefix: sub/
1615 EOF
1616         test_repo 12/sub
1617 '
1618
1619 #
1620 # case #13
1621 #
1622 ############################################################
1623 #
1624 # Input:
1625 #
1626 #  - GIT_WORK_TREE is set
1627 #  - GIT_DIR is not set
1628 #  - core.worktree is set
1629 #  - .git is a file
1630 #  - core.bare is not set, cwd is outside .git
1631 #
1632 # Output:
1633 #
1634 # #5 except that git_dir is set by .git file
1635
1636 test_expect_success '#13: setup' '
1637         unset GIT_DIR GIT_WORK_TREE &&
1638         mkdir 13 13/sub 13/sub/sub 13.wt 13.wt/sub 13/wt 13/wt/sub &&
1639         cd 13 &&
1640         git init &&
1641         git config core.worktree non-existent &&
1642         GIT_WORK_TREE=non-existent-too &&
1643         export GIT_WORK_TREE &&
1644         mv .git ../13.git &&
1645         echo gitdir: ../13.git >.git &&
1646         cd ..
1647 '
1648
1649 test_expect_failure '#13: at root' '
1650         cat >13/expected <<EOF &&
1651 setup: git_dir: $TRASH_DIRECTORY/13.git
1652 setup: worktree: $TRASH_DIRECTORY/13
1653 setup: cwd: $TRASH_DIRECTORY/13
1654 setup: prefix: (null)
1655 EOF
1656         test_repo 13
1657 '
1658
1659 test_expect_failure '#13: in subdir' '
1660         cat >13/sub/expected <<EOF &&
1661 setup: git_dir: $TRASH_DIRECTORY/13.git
1662 setup: worktree: $TRASH_DIRECTORY/13
1663 setup: cwd: $TRASH_DIRECTORY/13
1664 setup: prefix: sub/
1665 EOF
1666         test_repo 13/sub
1667 '
1668
1669 test_done