3 test_description
="Tests of cwd/prefix/worktree/gitdir setup in all cases
5 A few rules for repo setup:
7 1. GIT_DIR is relative to user's cwd. --git-dir is equivalent to
10 2. .git file is relative to parent directory. .git file is basically
11 symlink in disguise. The directory where .git file points to will
14 3. core.worktree is relative to git_dir.
16 4. GIT_WORK_TREE is relative to user's cwd. --work-tree is
17 equivalent to GIT_WORK_TREE.
19 5. GIT_WORK_TREE/core.worktree was originally meant to work only if
20 GIT_DIR is set, but earlier git didn't enforce it, and some scripts
21 depend on the implementation that happened to first discover .git by
22 going up from the users $cwd and then using the specified working tree
23 that may or may not have any relation to where .git was found in. This
24 historical behaviour must be kept.
26 6. Effective GIT_WORK_TREE overrides core.worktree and core.bare
28 7. Effective core.worktree conflicts with core.bare
30 8. If GIT_DIR is set but neither worktree nor bare setting is given,
31 original cwd becomes worktree.
33 9. If .git discovery is done inside a repo, the repo becomes a bare
34 repo. .git discovery is performed if GIT_DIR is not set.
36 10. If no worktree is available, cwd remains unchanged, prefix is
39 11. When user's cwd is outside worktree, cwd remains unchanged,
60 GIT_TRACE_SETUP
="$(pwd)/trace" git symbolic-ref HEAD
>/dev
/null
&&
61 grep '^setup: ' trace
>result
&&
62 test_cmp expected result
67 file=$1 var
=$2 value
=$3 &&
68 if test "$value" != unset
70 git config
--file="$file" "$var" "$value"
75 name
=$1 worktreecfg
=$2 gitfile
=$3 barecfg
=$4 &&
76 sane_unset GIT_DIR GIT_WORK_TREE
&&
79 maybe_config
"$name/.git/config" core.worktree
"$worktreecfg" &&
80 maybe_config
"$name/.git/config" core.bare
"$barecfg" &&
81 mkdir
-p "$name/sub/sub" &&
83 if test "${gitfile:+set}"
85 mv "$name/.git" "$name.git" &&
86 echo "gitdir: ../$name.git" >"$name/.git"
92 if test "$value" != unset
94 eval "$var=\$value" &&
100 worktreenv
=$1 gitdirenv
=$2 &&
101 sane_unset GIT_DIR GIT_WORK_TREE
&&
102 maybe_set GIT_DIR
"$gitdirenv" &&
103 maybe_set GIT_WORK_TREE
"$worktreeenv"
107 cat >"$1/expected" <<-EOF
116 name
=$1 worktreeenv
=$2 gitdirenv
=$3 &&
117 setup_env
"$worktreeenv" "$gitdirenv" &&
118 expect
"$name" "$4" "$5" "$6" "$7" &&
125 absgit
="$here/$N/.git"
131 absgit
="$here/$N.git"
132 dotgit
=$absgit dotdotgit
=$absgit
135 test_expect_success
"#$N: explicit GIT_WORK_TREE and GIT_DIR at toplevel" '
136 try_case $N "$here/$N" .git \
137 "$dotgit" "$here/$N" "$here/$N" "(null)" &&
139 "$dotgit" "$here/$N" "$here/$N" "(null)" &&
140 try_case $N "$here/$N" "$here/$N/.git" \
141 "$absgit" "$here/$N" "$here/$N" "(null)" &&
142 try_case $N . "$here/$N/.git" \
143 "$absgit" "$here/$N" "$here/$N" "(null)"
146 test_expect_success
"#$N: explicit GIT_WORK_TREE and GIT_DIR in subdir" '
147 try_case $N/sub/sub "$here/$N" ../../.git \
148 "$absgit" "$here/$N" "$here/$N" sub/sub/ &&
149 try_case $N/sub/sub ../.. ../../.git \
150 "$absgit" "$here/$N" "$here/$N" sub/sub/ &&
151 try_case $N/sub/sub "$here/$N" "$here/$N/.git" \
152 "$absgit" "$here/$N" "$here/$N" sub/sub/ &&
153 try_case $N/sub/sub ../.. "$here/$N/.git" \
154 "$absgit" "$here/$N" "$here/$N" sub/sub/
157 test_expect_success
"#$N: explicit GIT_WORK_TREE from parent of worktree" '
158 try_case $N "$here/$N/wt" .git \
159 "$dotgit" "$here/$N/wt" "$here/$N" "(null)" &&
160 try_case $N wt .git \
161 "$dotgit" "$here/$N/wt" "$here/$N" "(null)" &&
162 try_case $N wt "$here/$N/.git" \
163 "$absgit" "$here/$N/wt" "$here/$N" "(null)" &&
164 try_case $N "$here/$N/wt" "$here/$N/.git" \
165 "$absgit" "$here/$N/wt" "$here/$N" "(null)"
168 test_expect_success
"#$N: explicit GIT_WORK_TREE from nephew of worktree" '
169 try_case $N/sub/sub "$here/$N/wt" ../../.git \
170 "$dotdotgit" "$here/$N/wt" "$here/$N/sub/sub" "(null)" &&
171 try_case $N/sub/sub ../../wt ../../.git \
172 "$dotdotgit" "$here/$N/wt" "$here/$N/sub/sub" "(null)" &&
173 try_case $N/sub/sub ../../wt "$here/$N/.git" \
174 "$absgit" "$here/$N/wt" "$here/$N/sub/sub" "(null)" &&
175 try_case $N/sub/sub "$here/$N/wt" "$here/$N/.git" \
176 "$absgit" "$here/$N/wt" "$here/$N/sub/sub" "(null)"
179 test_expect_success
"#$N: chdir_to_toplevel uses worktree, not git dir" '
180 try_case $N "$here" .git \
181 "$absgit" "$here" "$here" $N/ &&
182 try_case $N .. .git \
183 "$absgit" "$here" "$here" $N/ &&
184 try_case $N .. "$here/$N/.git" \
185 "$absgit" "$here" "$here" $N/ &&
186 try_case $N "$here" "$here/$N/.git" \
187 "$absgit" "$here" "$here" $N/
190 test_expect_success
"#$N: chdir_to_toplevel uses worktree (from subdir)" '
191 try_case $N/sub/sub "$here" ../../.git \
192 "$absgit" "$here" "$here" $N/sub/sub/ &&
193 try_case $N/sub/sub ../../.. ../../.git \
194 "$absgit" "$here" "$here" $N/sub/sub/ &&
195 try_case $N/sub/sub ../../../ "$here/$N/.git" \
196 "$absgit" "$here" "$here" $N/sub/sub/ &&
197 try_case $N/sub/sub "$here" "$here/$N/.git" \
198 "$absgit" "$here" "$here" $N/sub/sub/
202 # try_repo #c GIT_WORK_TREE GIT_DIR core.worktree .gitfile? core.bare \
203 # (git dir) (work tree) (cwd) (prefix) \ <-- at toplevel
204 # (git dir) (work tree) (cwd) (prefix) <-- from subdir
206 name
=$1 worktreeenv
=$2 gitdirenv
=$3 &&
207 setup_repo
"$name" "$4" "$5" "$6" &&
209 try_case
"$name" "$worktreeenv" "$gitdirenv" \
210 "$1" "$2" "$3" "$4" &&
213 /* | ?
:/* |
unset) ;;
215 gitdirenv
=..
/$gitdirenv ;;
217 try_case
"$name/sub" "$worktreeenv" "$gitdirenv" \
221 # Bit 0 = GIT_WORK_TREE
223 # Bit 2 = core.worktree
224 # Bit 3 = .git is a file
226 # Case# = encoding of the above 5 bits
228 test_expect_success
'#0: nonbare repo, no explicit configuration' '
229 try_repo 0 unset unset unset "" unset \
230 .git "$here/0" "$here/0" "(null)" \
231 .git "$here/0" "$here/0" sub/ 2>message &&
235 test_expect_success
'#1: GIT_WORK_TREE without explicit GIT_DIR is accepted' '
237 try_repo 1 "$here" unset unset "" unset \
238 "$here/1/.git" "$here" "$here" 1/ \
239 "$here/1/.git" "$here" "$here" 1/sub/ 2>message &&
243 test_expect_success
'#2: worktree defaults to cwd with explicit GIT_DIR' '
244 try_repo 2 unset "$here/2/.git" unset "" unset \
245 "$here/2/.git" "$here/2" "$here/2" "(null)" \
246 "$here/2/.git" "$here/2/sub" "$here/2/sub" "(null)"
249 test_expect_success
'#2b: relative GIT_DIR' '
250 try_repo 2b unset ".git" unset "" unset \
251 ".git" "$here/2b" "$here/2b" "(null)" \
252 "../.git" "$here/2b/sub" "$here/2b/sub" "(null)"
255 test_expect_success
'#3: setup' '
256 setup_repo 3 unset "" unset &&
257 mkdir -p 3/sub/sub 3/wt/sub
261 test_expect_success
'#4: core.worktree without GIT_DIR set is accepted' '
262 setup_repo 4 ../sub "" unset &&
263 mkdir -p 4/sub sub &&
264 try_case 4 unset unset \
265 .git "$here/4/sub" "$here/4" "(null)" \
266 "$here/4/.git" "$here/4/sub" "$here/4/sub" "(null)" 2>message &&
270 test_expect_success
'#5: core.worktree + GIT_WORK_TREE is accepted' '
271 # or: you cannot intimidate away the lack of GIT_DIR setting
272 try_repo 5 "$here" unset "$here/5" "" unset \
273 "$here/5/.git" "$here" "$here" 5/ \
274 "$here/5/.git" "$here" "$here" 5/sub/ 2>message &&
275 try_repo 5a .. unset "$here/5a" "" unset \
276 "$here/5a/.git" "$here" "$here" 5a/ \
277 "$here/5a/.git" "$here/5a" "$here/5a" sub/ &&
281 test_expect_success
'#6: setting GIT_DIR brings core.worktree to life' '
282 setup_repo 6 "$here/6" "" unset &&
283 try_case 6 unset .git \
284 .git "$here/6" "$here/6" "(null)" &&
285 try_case 6 unset "$here/6/.git" \
286 "$here/6/.git" "$here/6" "$here/6" "(null)" &&
287 try_case 6/sub/sub unset ../../.git \
288 "$here/6/.git" "$here/6" "$here/6" sub/sub/ &&
289 try_case 6/sub/sub unset "$here/6/.git" \
290 "$here/6/.git" "$here/6" "$here/6" sub/sub/
293 test_expect_success
'#6b: GIT_DIR set, core.worktree relative' '
294 setup_repo 6b .. "" unset &&
295 try_case 6b unset .git \
296 .git "$here/6b" "$here/6b" "(null)" &&
297 try_case 6b unset "$here/6b/.git" \
298 "$here/6b/.git" "$here/6b" "$here/6b" "(null)" &&
299 try_case 6b/sub/sub unset ../../.git \
300 "$here/6b/.git" "$here/6b" "$here/6b" sub/sub/ &&
301 try_case 6b/sub/sub unset "$here/6b/.git" \
302 "$here/6b/.git" "$here/6b" "$here/6b" sub/sub/
305 test_expect_success
'#6c: GIT_DIR set, core.worktree=../wt (absolute)' '
306 setup_repo 6c "$here/6c/wt" "" unset &&
307 mkdir -p 6c/wt/sub &&
309 try_case 6c unset .git \
310 .git "$here/6c/wt" "$here/6c" "(null)" &&
311 try_case 6c unset "$here/6c/.git" \
312 "$here/6c/.git" "$here/6c/wt" "$here/6c" "(null)" &&
313 try_case 6c/sub/sub unset ../../.git \
314 ../../.git "$here/6c/wt" "$here/6c/sub/sub" "(null)" &&
315 try_case 6c/sub/sub unset "$here/6c/.git" \
316 "$here/6c/.git" "$here/6c/wt" "$here/6c/sub/sub" "(null)"
319 test_expect_success
'#6d: GIT_DIR set, core.worktree=../wt (relative)' '
320 setup_repo 6d "$here/6d/wt" "" unset &&
321 mkdir -p 6d/wt/sub &&
323 try_case 6d unset .git \
324 .git "$here/6d/wt" "$here/6d" "(null)" &&
325 try_case 6d unset "$here/6d/.git" \
326 "$here/6d/.git" "$here/6d/wt" "$here/6d" "(null)" &&
327 try_case 6d/sub/sub unset ../../.git \
328 ../../.git "$here/6d/wt" "$here/6d/sub/sub" "(null)" &&
329 try_case 6d/sub/sub unset "$here/6d/.git" \
330 "$here/6d/.git" "$here/6d/wt" "$here/6d/sub/sub" "(null)"
333 test_expect_success
'#6e: GIT_DIR set, core.worktree=../.. (absolute)' '
334 setup_repo 6e "$here" "" unset &&
335 try_case 6e unset .git \
336 "$here/6e/.git" "$here" "$here" 6e/ &&
337 try_case 6e unset "$here/6e/.git" \
338 "$here/6e/.git" "$here" "$here" 6e/ &&
339 try_case 6e/sub/sub unset ../../.git \
340 "$here/6e/.git" "$here" "$here" 6e/sub/sub/ &&
341 try_case 6e/sub/sub unset "$here/6e/.git" \
342 "$here/6e/.git" "$here" "$here" 6e/sub/sub/
345 test_expect_success
'#6f: GIT_DIR set, core.worktree=../.. (relative)' '
346 setup_repo 6f ../../ "" unset &&
347 try_case 6f unset .git \
348 "$here/6f/.git" "$here" "$here" 6f/ &&
349 try_case 6f unset "$here/6f/.git" \
350 "$here/6f/.git" "$here" "$here" 6f/ &&
351 try_case 6f/sub/sub unset ../../.git \
352 "$here/6f/.git" "$here" "$here" 6f/sub/sub/ &&
353 try_case 6f/sub/sub unset "$here/6f/.git" \
354 "$here/6f/.git" "$here" "$here" 6f/sub/sub/
357 # case #7: GIT_WORK_TREE overrides core.worktree.
358 test_expect_success
'#7: setup' '
359 setup_repo 7 non-existent "" unset &&
360 mkdir -p 7/sub/sub 7/wt/sub
364 test_expect_success
'#8: gitfile, easy case' '
365 try_repo 8 unset unset unset gitfile unset \
366 "$here/8.git" "$here/8" "$here/8" "(null)" \
367 "$here/8.git" "$here/8" "$here/8" sub/
370 test_expect_success
'#9: GIT_WORK_TREE accepted with gitfile' '
372 try_repo 9 wt unset unset gitfile unset \
373 "$here/9.git" "$here/9/wt" "$here/9" "(null)" \
374 "$here/9.git" "$here/9/sub/wt" "$here/9/sub" "(null)" 2>message &&
378 test_expect_success
'#10: GIT_DIR can point to gitfile' '
379 try_repo 10 unset "$here/10/.git" unset gitfile unset \
380 "$here/10.git" "$here/10" "$here/10" "(null)" \
381 "$here/10.git" "$here/10/sub" "$here/10/sub" "(null)"
384 test_expect_success
'#10b: relative GIT_DIR can point to gitfile' '
385 try_repo 10b unset .git unset gitfile unset \
386 "$here/10b.git" "$here/10b" "$here/10b" "(null)" \
387 "$here/10b.git" "$here/10b/sub" "$here/10b/sub" "(null)"
390 # case #11: GIT_WORK_TREE works, gitfile case.
391 test_expect_success
'#11: setup' '
392 setup_repo 11 unset gitfile unset &&
393 mkdir -p 11/sub/sub 11/wt/sub
395 run_wt_tests
11 gitfile
397 test_expect_success
'#12: core.worktree with gitfile is accepted' '
398 try_repo 12 unset unset "$here/12" gitfile unset \
399 "$here/12.git" "$here/12" "$here/12" "(null)" \
400 "$here/12.git" "$here/12" "$here/12" sub/ 2>message &&
404 test_expect_success
'#13: core.worktree+GIT_WORK_TREE accepted (with gitfile)' '
405 # or: you cannot intimidate away the lack of GIT_DIR setting
406 try_repo 13 non-existent-too unset non-existent gitfile unset \
407 "$here/13.git" "$here/13/non-existent-too" "$here/13" "(null)" \
408 "$here/13.git" "$here/13/sub/non-existent-too" "$here/13/sub" "(null)" 2>message &&
413 # If this were more table-driven, it could share code with case #6.
415 test_expect_success
'#14: core.worktree with GIT_DIR pointing to gitfile' '
416 setup_repo 14 "$here/14" gitfile unset &&
417 try_case 14 unset .git \
418 "$here/14.git" "$here/14" "$here/14" "(null)" &&
419 try_case 14 unset "$here/14/.git" \
420 "$here/14.git" "$here/14" "$here/14" "(null)" &&
421 try_case 14/sub/sub unset ../../.git \
422 "$here/14.git" "$here/14" "$here/14" sub/sub/ &&
423 try_case 14/sub/sub unset "$here/14/.git" \
424 "$here/14.git" "$here/14" "$here/14" sub/sub/ &&
426 setup_repo 14c "$here/14c/wt" gitfile unset &&
427 mkdir -p 14c/wt/sub &&
429 try_case 14c unset .git \
430 "$here/14c.git" "$here/14c/wt" "$here/14c" "(null)" &&
431 try_case 14c unset "$here/14c/.git" \
432 "$here/14c.git" "$here/14c/wt" "$here/14c" "(null)" &&
433 try_case 14c/sub/sub unset ../../.git \
434 "$here/14c.git" "$here/14c/wt" "$here/14c/sub/sub" "(null)" &&
435 try_case 14c/sub/sub unset "$here/14c/.git" \
436 "$here/14c.git" "$here/14c/wt" "$here/14c/sub/sub" "(null)" &&
438 setup_repo 14d "$here/14d/wt" gitfile unset &&
439 mkdir -p 14d/wt/sub &&
441 try_case 14d unset .git \
442 "$here/14d.git" "$here/14d/wt" "$here/14d" "(null)" &&
443 try_case 14d unset "$here/14d/.git" \
444 "$here/14d.git" "$here/14d/wt" "$here/14d" "(null)" &&
445 try_case 14d/sub/sub unset ../../.git \
446 "$here/14d.git" "$here/14d/wt" "$here/14d/sub/sub" "(null)" &&
447 try_case 14d/sub/sub unset "$here/14d/.git" \
448 "$here/14d.git" "$here/14d/wt" "$here/14d/sub/sub" "(null)" &&
450 setup_repo 14e "$here" gitfile unset &&
451 try_case 14e unset .git \
452 "$here/14e.git" "$here" "$here" 14e/ &&
453 try_case 14e unset "$here/14e/.git" \
454 "$here/14e.git" "$here" "$here" 14e/ &&
455 try_case 14e/sub/sub unset ../../.git \
456 "$here/14e.git" "$here" "$here" 14e/sub/sub/ &&
457 try_case 14e/sub/sub unset "$here/14e/.git" \
458 "$here/14e.git" "$here" "$here" 14e/sub/sub/
461 test_expect_success
'#14b: core.worktree is relative to actual git dir' '
462 setup_repo 14b ../14b gitfile unset &&
463 try_case 14b unset .git \
464 "$here/14b.git" "$here/14b" "$here/14b" "(null)" &&
465 try_case 14b unset "$here/14b/.git" \
466 "$here/14b.git" "$here/14b" "$here/14b" "(null)" &&
467 try_case 14b/sub/sub unset ../../.git \
468 "$here/14b.git" "$here/14b" "$here/14b" sub/sub/ &&
469 try_case 14b/sub/sub unset "$here/14b/.git" \
470 "$here/14b.git" "$here/14b" "$here/14b" sub/sub/ &&
472 setup_repo 14f ../ gitfile unset &&
473 try_case 14f unset .git \
474 "$here/14f.git" "$here" "$here" 14f/ &&
475 try_case 14f unset "$here/14f/.git" \
476 "$here/14f.git" "$here" "$here" 14f/ &&
477 try_case 14f/sub/sub unset ../../.git \
478 "$here/14f.git" "$here" "$here" 14f/sub/sub/ &&
479 try_case 14f/sub/sub unset "$here/14f/.git" \
480 "$here/14f.git" "$here" "$here" 14f/sub/sub/
483 # case #15: GIT_WORK_TREE overrides core.worktree (gitfile case).
484 test_expect_success
'#15: setup' '
485 setup_repo 15 non-existent gitfile unset &&
486 mkdir -p 15/sub/sub 15/wt/sub
488 run_wt_tests
15 gitfile
490 test_expect_success
'#16a: implicitly bare repo (cwd inside .git dir)' '
491 setup_repo 16a unset "" unset &&
492 mkdir -p 16a/.git/wt/sub &&
494 try_case 16a/.git unset unset \
495 . "(null)" "$here/16a/.git" "(null)" &&
496 try_case 16a/.git/wt unset unset \
497 "$here/16a/.git" "(null)" "$here/16a/.git/wt" "(null)" &&
498 try_case 16a/.git/wt/sub unset unset \
499 "$here/16a/.git" "(null)" "$here/16a/.git/wt/sub" "(null)"
502 test_expect_success
'#16b: bare .git (cwd inside .git dir)' '
503 setup_repo 16b unset "" true &&
504 mkdir -p 16b/.git/wt/sub &&
506 try_case 16b/.git unset unset \
507 . "(null)" "$here/16b/.git" "(null)" &&
508 try_case 16b/.git/wt unset unset \
509 "$here/16b/.git" "(null)" "$here/16b/.git/wt" "(null)" &&
510 try_case 16b/.git/wt/sub unset unset \
511 "$here/16b/.git" "(null)" "$here/16b/.git/wt/sub" "(null)"
514 test_expect_success
'#16c: bare .git has no worktree' '
515 try_repo 16c unset unset unset "" true \
516 .git "(null)" "$here/16c" "(null)" \
517 "$here/16c/.git" "(null)" "$here/16c/sub" "(null)"
520 test_expect_success
'#16d: bareness preserved across alias' '
521 setup_repo 16d unset "" unset &&
524 test_must_fail git status &&
525 git config alias.st status &&
526 test_must_fail git st
530 test_expect_success
'#16e: bareness preserved by --bare' '
531 setup_repo 16e unset "" unset &&
534 test_must_fail git status &&
535 test_must_fail git --bare status
539 test_expect_success
'#17: GIT_WORK_TREE without explicit GIT_DIR is accepted (bare case)' '
541 setup_repo 17a unset "" true &&
542 setup_repo 17b unset "" true &&
543 mkdir -p 17a/.git/wt/sub &&
544 mkdir -p 17b/.git/wt/sub &&
546 try_case 17a/.git "$here/17a" unset \
547 "$here/17a/.git" "$here/17a" "$here/17a" .git/ \
549 try_case 17a/.git/wt "$here/17a" unset \
550 "$here/17a/.git" "$here/17a" "$here/17a" .git/wt/ &&
551 try_case 17a/.git/wt/sub "$here/17a" unset \
552 "$here/17a/.git" "$here/17a" "$here/17a" .git/wt/sub/ &&
554 try_case 17b/.git "$here/17b" unset \
555 "$here/17b/.git" "$here/17b" "$here/17b" .git/ &&
556 try_case 17b/.git/wt "$here/17b" unset \
557 "$here/17b/.git" "$here/17b" "$here/17b" .git/wt/ &&
558 try_case 17b/.git/wt/sub "$here/17b" unset \
559 "$here/17b/.git" "$here/17b" "$here/17b" .git/wt/sub/ &&
561 try_repo 17c "$here/17c" unset unset "" true \
562 .git "$here/17c" "$here/17c" "(null)" \
563 "$here/17c/.git" "$here/17c" "$here/17c" sub/ 2>message &&
567 test_expect_success
'#18: bare .git named by GIT_DIR has no worktree' '
568 try_repo 18 unset .git unset "" true \
569 .git "(null)" "$here/18" "(null)" \
570 ../.git "(null)" "$here/18/sub" "(null)" &&
571 try_repo 18b unset "$here/18b/.git" unset "" true \
572 "$here/18b/.git" "(null)" "$here/18b" "(null)" \
573 "$here/18b/.git" "(null)" "$here/18b/sub" "(null)"
576 # Case #19: GIT_DIR + GIT_WORK_TREE suppresses bareness.
577 test_expect_success
'#19: setup' '
578 setup_repo 19 unset "" true &&
579 mkdir -p 19/sub/sub 19/wt/sub
583 test_expect_success
'#20a: core.worktree without GIT_DIR accepted (inside .git)' '
585 setup_repo 20a "$here/20a" "" unset &&
586 mkdir -p 20a/.git/wt/sub &&
587 try_case 20a/.git unset unset \
588 "$here/20a/.git" "$here/20a" "$here/20a" .git/ 2>message &&
589 try_case 20a/.git/wt unset unset \
590 "$here/20a/.git" "$here/20a" "$here/20a" .git/wt/ &&
591 try_case 20a/.git/wt/sub unset unset \
592 "$here/20a/.git" "$here/20a" "$here/20a" .git/wt/sub/ &&
596 test_expect_success
'#20b/c: core.worktree and core.bare conflict' '
597 setup_repo 20b non-existent "" true &&
598 mkdir -p 20b/.git/wt/sub &&
601 test_must_fail git status >/dev/null
603 grep "core.bare and core.worktree" message
606 test_expect_success
'#20d: core.worktree and core.bare OK when working tree not needed' '
607 setup_repo 20d non-existent "" true &&
608 mkdir -p 20d/.git/wt/sub &&
611 git config foo.bar value
615 # Case #21: core.worktree/GIT_WORK_TREE overrides core.bare' '
616 test_expect_success
'#21: setup, core.worktree warns before overriding core.bare' '
617 setup_repo 21 non-existent "" unset &&
618 mkdir -p 21/.git/wt/sub &&
621 GIT_WORK_TREE="$here/21" &&
622 export GIT_WORK_TREE &&
623 git status >/dev/null
630 test_expect_success
'#22a: core.worktree = GIT_DIR = .git dir' '
633 setup_repo 22a "$here/22a/.git" "" unset &&
634 setup_repo 22ab . "" unset &&
635 mkdir -p 22a/.git/sub 22a/sub &&
636 mkdir -p 22ab/.git/sub 22ab/sub &&
637 try_case 22a/.git unset . \
638 . "$here/22a/.git" "$here/22a/.git" "(null)" &&
639 try_case 22a/.git unset "$here/22a/.git" \
640 "$here/22a/.git" "$here/22a/.git" "$here/22a/.git" "(null)" &&
641 try_case 22a/.git/sub unset .. \
642 "$here/22a/.git" "$here/22a/.git" "$here/22a/.git" sub/ &&
643 try_case 22a/.git/sub unset "$here/22a/.git" \
644 "$here/22a/.git" "$here/22a/.git" "$here/22a/.git" sub/ &&
646 try_case 22ab/.git unset . \
647 . "$here/22ab/.git" "$here/22ab/.git" "(null)" &&
648 try_case 22ab/.git unset "$here/22ab/.git" \
649 "$here/22ab/.git" "$here/22ab/.git" "$here/22ab/.git" "(null)" &&
650 try_case 22ab/.git/sub unset .. \
651 "$here/22ab/.git" "$here/22ab/.git" "$here/22ab/.git" sub/ &&
652 try_case 22ab/.git unset "$here/22ab/.git" \
653 "$here/22ab/.git" "$here/22ab/.git" "$here/22ab/.git" "(null)"
656 test_expect_success
'#22b: core.worktree child of .git, GIT_DIR=.git' '
657 setup_repo 22b "$here/22b/.git/wt" "" unset &&
658 setup_repo 22bb wt "" unset &&
659 mkdir -p 22b/.git/sub 22b/sub 22b/.git/wt/sub 22b/wt/sub &&
660 mkdir -p 22bb/.git/sub 22bb/sub 22bb/.git/wt 22bb/wt &&
662 try_case 22b/.git unset . \
663 . "$here/22b/.git/wt" "$here/22b/.git" "(null)" &&
664 try_case 22b/.git unset "$here/22b/.git" \
665 "$here/22b/.git" "$here/22b/.git/wt" "$here/22b/.git" "(null)" &&
666 try_case 22b/.git/sub unset .. \
667 .. "$here/22b/.git/wt" "$here/22b/.git/sub" "(null)" &&
668 try_case 22b/.git/sub unset "$here/22b/.git" \
669 "$here/22b/.git" "$here/22b/.git/wt" "$here/22b/.git/sub" "(null)" &&
671 try_case 22bb/.git unset . \
672 . "$here/22bb/.git/wt" "$here/22bb/.git" "(null)" &&
673 try_case 22bb/.git unset "$here/22bb/.git" \
674 "$here/22bb/.git" "$here/22bb/.git/wt" "$here/22bb/.git" "(null)" &&
675 try_case 22bb/.git/sub unset .. \
676 .. "$here/22bb/.git/wt" "$here/22bb/.git/sub" "(null)" &&
677 try_case 22bb/.git/sub unset "$here/22bb/.git" \
678 "$here/22bb/.git" "$here/22bb/.git/wt" "$here/22bb/.git/sub" "(null)"
681 test_expect_success
'#22c: core.worktree = .git/.., GIT_DIR=.git' '
682 setup_repo 22c "$here/22c" "" unset &&
683 setup_repo 22cb .. "" unset &&
684 mkdir -p 22c/.git/sub 22c/sub &&
685 mkdir -p 22cb/.git/sub 22cb/sub &&
687 try_case 22c/.git unset . \
688 "$here/22c/.git" "$here/22c" "$here/22c" .git/ &&
689 try_case 22c/.git unset "$here/22c/.git" \
690 "$here/22c/.git" "$here/22c" "$here/22c" .git/ &&
691 try_case 22c/.git/sub unset .. \
692 "$here/22c/.git" "$here/22c" "$here/22c" .git/sub/ &&
693 try_case 22c/.git/sub unset "$here/22c/.git" \
694 "$here/22c/.git" "$here/22c" "$here/22c" .git/sub/ &&
696 try_case 22cb/.git unset . \
697 "$here/22cb/.git" "$here/22cb" "$here/22cb" .git/ &&
698 try_case 22cb/.git unset "$here/22cb/.git" \
699 "$here/22cb/.git" "$here/22cb" "$here/22cb" .git/ &&
700 try_case 22cb/.git/sub unset .. \
701 "$here/22cb/.git" "$here/22cb" "$here/22cb" .git/sub/ &&
702 try_case 22cb/.git/sub unset "$here/22cb/.git" \
703 "$here/22cb/.git" "$here/22cb" "$here/22cb" .git/sub/
706 test_expect_success
'#22.2: core.worktree and core.bare conflict' '
707 setup_repo 22 "$here/22" "" true &&
712 test_must_fail git status 2>result
718 test_must_fail git status 2>result
720 grep "core.bare and core.worktree" 22/.git/result &&
721 grep "core.bare and core.worktree" 22/result
724 # Case #23: GIT_DIR + GIT_WORK_TREE(+core.worktree) suppresses bareness.
725 test_expect_success
'#23: setup' '
726 setup_repo 23 non-existent "" true &&
727 mkdir -p 23/sub/sub 23/wt/sub
731 test_expect_success
'#24: bare repo has no worktree (gitfile case)' '
732 try_repo 24 unset unset unset gitfile true \
733 "$here/24.git" "(null)" "$here/24" "(null)" \
734 "$here/24.git" "(null)" "$here/24/sub" "(null)"
737 test_expect_success
'#25: GIT_WORK_TREE accepted if GIT_DIR unset (bare gitfile case)' '
738 try_repo 25 "$here/25" unset unset gitfile true \
739 "$here/25.git" "$here/25" "$here/25" "(null)" \
740 "$here/25.git" "$here/25" "$here/25" "sub/" 2>message &&
744 test_expect_success
'#26: bare repo has no worktree (GIT_DIR -> gitfile case)' '
745 try_repo 26 unset "$here/26/.git" unset gitfile true \
746 "$here/26.git" "(null)" "$here/26" "(null)" \
747 "$here/26.git" "(null)" "$here/26/sub" "(null)" &&
748 try_repo 26b unset .git unset gitfile true \
749 "$here/26b.git" "(null)" "$here/26b" "(null)" \
750 "$here/26b.git" "(null)" "$here/26b/sub" "(null)"
753 # Case #27: GIT_DIR + GIT_WORK_TREE suppresses bareness (with gitfile).
754 test_expect_success
'#27: setup' '
755 setup_repo 27 unset gitfile true &&
756 mkdir -p 27/sub/sub 27/wt/sub
758 run_wt_tests
27 gitfile
760 test_expect_success
'#28: core.worktree and core.bare conflict (gitfile case)' '
761 setup_repo 28 "$here/28" gitfile true &&
764 test_must_fail git status
766 grep "core.bare and core.worktree" message
769 # Case #29: GIT_WORK_TREE(+core.worktree) overrides core.bare (gitfile case).
770 test_expect_success
'#29: setup' '
771 setup_repo 29 non-existent gitfile true &&
772 mkdir -p 29/sub/sub 29/wt/sub &&
775 GIT_WORK_TREE="$here/29" &&
776 export GIT_WORK_TREE &&
781 run_wt_tests
29 gitfile
783 test_expect_success
'#30: core.worktree and core.bare conflict (gitfile version)' '
784 # Just like case #22.
785 setup_repo 30 "$here/30" gitfile true &&
788 test_must_fail env GIT_DIR=.git git status 2>result
790 grep "core.bare and core.worktree" 30/result
793 # Case #31: GIT_DIR + GIT_WORK_TREE(+core.worktree) suppresses
794 # bareness (gitfile version).
795 test_expect_success
'#31: setup' '
796 setup_repo 31 non-existent gitfile true &&
797 mkdir -p 31/sub/sub 31/wt/sub
799 run_wt_tests
31 gitfile