diff --git a/t/t1510-repo-setup.sh b/t/t1510-repo-setup.sh index f42f206547469c28de4fc9bb7ea70cf67655f4d6..4f8f9760a5903aa510776e1f096b79803b4ed416 100755 --- a/t/t1510-repo-setup.sh +++ b/t/t1510-repo-setup.sh @@ -37,6 +37,8 @@ A few rules for repo setup: " . ./test-lib.sh +here=$(pwd) + test_repo () { ( cd "$1" && @@ -57,4483 +59,698 @@ test_repo () { ) } -# Bit 0 = GIT_WORK_TREE -# Bit 1 = GIT_DIR -# Bit 2 = core.worktree -# Bit 3 = .git is a file -# Bit 4 = bare repo -# Case# = encoding of the above 5 bits - -# -# Case #0 -# -############################################################ -# -# Input: -# -# - GIT_WORK_TREE is not set -# - GIT_DIR is not set -# - core.worktree is not set -# - .git is a directory -# - core.bare is not set, cwd is outside .git -# -# Output: -# -# - worktree is .git's parent directory -# - cwd is at worktree root dir -# - prefix is calculated -# - git_dir is set to ".git" -# - cwd can't be outside worktree - -test_expect_success '#0: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 0 0/sub && - (cd 0 && git init) && - here=$(pwd) -' - -test_expect_success '#0: at root' ' - cat >0/expected <0/sub/expected < #0 - -test_expect_success '#1: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 1 1/sub 1.wt 1.wt/sub 1/wt 1/wt/sub && - cd 1 && - git init && - GIT_WORK_TREE=non-existent && - export GIT_WORK_TREE && - cd .. -' - -test_expect_success '#1: at root' ' - cat >1/expected <1/sub/expected <2/expected <2/sub/expected <2/expected <2/sub/expected <3/expected <3/expected <3/expected <3/expected <3/sub/sub/expected <3/sub/sub/expected <3/sub/expected <3/sub/sub/expected <3/expected <3/expected <3/expected <3/expected <3/sub/sub/expected <3/sub/sub/expected <3/sub/sub/expected <3/sub/sub/expected <3/expected <3/expected <3/expected <3/expected <3/sub/sub/expected <3/sub/sub/expected <3/sub/sub/expected <3/sub/sub/expected < #0 - -test_expect_success '#4: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 4 4/sub && - cd 4 && - git init && - git config core.worktree non-existent && - cd .. -' - -test_expect_success '#4: at root' ' - cat >4/expected <4/sub/expected < #0 +maybe_config () { + file=$1 var=$2 value=$3 && + if test "$value" != unset + then + git config --file="$file" "$var" "$value" + fi +} -test_expect_success '#5: setup' ' +setup_repo () { + name=$1 worktreecfg=$2 gitfile=$3 barecfg=$4 && sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 5 5/sub && - cd 5 && - git init && - git config core.worktree non-existent && - GIT_WORK_TREE=non-existent-too && - export GIT_WORK_TREE && - cd .. -' -test_expect_success '#5: at root' ' - cat >5/expected <5/sub/expected <"$name/.git" + fi +} -# -# case #6 -# -############################################################ -# -# Input: -# -# - GIT_WORK_TREE is not set -# - GIT_DIR is set -# - core.worktree is set -# - .git is a directory -# - core.bare is not set, cwd is outside .git -# -# Output: -# -# - worktree is at core.worktree -# - cwd is at worktree root -# - prefix is calculated -# - git_dir is at $GIT_DIR -# - cwd can be outside worktree +maybe_set () { + var=$1 value=$2 && + if test "$value" != unset + then + eval "$var=\$value" && + export $var + fi +} -test_expect_success '#6: setup' ' +setup_env () { + worktreenv=$1 gitdirenv=$2 && sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 6 6/sub 6/sub/sub 6.wt 6.wt/sub 6/wt 6/wt/sub && - cd 6 && git init && cd .. -' - -test_expect_success '#6: GIT_DIR(rel), core.worktree=.. at root' ' - cat >6/expected <6/expected <6/expected <6/expected <6/sub/sub/expected <6/sub/sub/expected <6/sub/expected <6/sub/sub/expected <6/expected <6/expected <6/expected <6/expected <6/sub/sub/expected <6/sub/sub/expected <6/sub/sub/expected <6/sub/sub/expected <"$1/expected" <<-EOF + setup: git_dir: $2 + setup: worktree: $3 + setup: cwd: $4 + setup: prefix: $5 + EOF +} -test_expect_success '#6: GIT_DIR(rel), core.worktree=../.. at root' ' - cat >6/expected <6/expected <6/expected <6/expected <6/sub/sub/expected <6/sub/sub/expected <6/sub/sub/expected <6/sub/sub/expected < #3 - +test_expect_success '#3: setup' ' + setup_repo 3 unset "" unset && + mkdir -p 3/sub/sub 3/wt/sub +' +run_wt_tests 3 + +test_expect_success '#4: core.worktree without GIT_DIR set is ignored' ' + try_repo 4 unset unset non-existent "" unset \ + .git "$here/4" "$here/4" "(null)" \ + .git "$here/4" "$here/4" sub/ +' + +test_expect_success '#5: core.worktree + GIT_WORK_TREE is still ignored' ' + # or: you cannot intimidate away the lack of GIT_DIR setting + try_repo 5 non-existent-too unset non-existent "" unset \ + .git "$here/5" "$here/5" "(null)" \ + .git "$here/5" "$here/5" sub/ +' + +test_expect_success '#6: setting GIT_DIR brings core.worktree to life' ' + setup_repo 6 "$here/6" "" unset && + try_case 6 unset .git \ + .git "$here/6" "$here/6" "(null)" && + try_case 6 unset "$here/6/.git" \ + "$here/6/.git" "$here/6" "$here/6" "(null)" && + try_case 6/sub/sub unset ../../.git \ + "$here/6/.git" "$here/6" "$here/6" sub/sub/ && + try_case 6/sub/sub unset "$here/6/.git" \ + "$here/6/.git" "$here/6" "$here/6" sub/sub/ +' + +test_expect_success '#6b: GIT_DIR set, core.worktree relative' ' + setup_repo 6b .. "" unset && + try_case 6b unset .git \ + .git "$here/6b" "$here/6b" "(null)" && + try_case 6b unset "$here/6b/.git" \ + "$here/6b/.git" "$here/6b" "$here/6b" "(null)" && + try_case 6b/sub/sub unset ../../.git \ + "$here/6b/.git" "$here/6b" "$here/6b" sub/sub/ && + try_case 6b/sub/sub unset "$here/6b/.git" \ + "$here/6b/.git" "$here/6b" "$here/6b" sub/sub/ +' + +test_expect_success '#6c: GIT_DIR set, core.worktree=../wt (absolute)' ' + setup_repo 6c "$here/6c/wt" "" unset && + mkdir -p 6c/wt/sub && + + try_case 6c unset .git \ + .git "$here/6c/wt" "$here/6c" "(null)" && + try_case 6c unset "$here/6c/.git" \ + "$here/6c/.git" "$here/6c/wt" "$here/6c" "(null)" && + try_case 6c/sub/sub unset ../../.git \ + ../../.git "$here/6c/wt" "$here/6c/sub/sub" "(null)" && + try_case 6c/sub/sub unset "$here/6c/.git" \ + "$here/6c/.git" "$here/6c/wt" "$here/6c/sub/sub" "(null)" +' + +test_expect_success '#6d: GIT_DIR set, core.worktree=../wt (relative)' ' + setup_repo 6d "$here/6d/wt" "" unset && + mkdir -p 6d/wt/sub && + + try_case 6d unset .git \ + .git "$here/6d/wt" "$here/6d" "(null)" && + try_case 6d unset "$here/6d/.git" \ + "$here/6d/.git" "$here/6d/wt" "$here/6d" "(null)" && + try_case 6d/sub/sub unset ../../.git \ + ../../.git "$here/6d/wt" "$here/6d/sub/sub" "(null)" && + try_case 6d/sub/sub unset "$here/6d/.git" \ + "$here/6d/.git" "$here/6d/wt" "$here/6d/sub/sub" "(null)" +' + +test_expect_success '#6e: GIT_DIR set, core.worktree=../.. (absolute)' ' + setup_repo 6e "$here" "" unset && + try_case 6e unset .git \ + "$here/6e/.git" "$here" "$here" 6e/ && + try_case 6e unset "$here/6e/.git" \ + "$here/6e/.git" "$here" "$here" 6e/ && + try_case 6e/sub/sub unset ../../.git \ + "$here/6e/.git" "$here" "$here" 6e/sub/sub/ && + try_case 6e/sub/sub unset "$here/6e/.git" \ + "$here/6e/.git" "$here" "$here" 6e/sub/sub/ +' + +test_expect_success '#6f: GIT_DIR set, core.worktree=../.. (relative)' ' + setup_repo 6f ../../ "" unset && + try_case 6f unset .git \ + "$here/6f/.git" "$here" "$here" 6f/ && + try_case 6f unset "$here/6f/.git" \ + "$here/6f/.git" "$here" "$here" 6f/ && + try_case 6f/sub/sub unset ../../.git \ + "$here/6f/.git" "$here" "$here" 6f/sub/sub/ && + try_case 6f/sub/sub unset "$here/6f/.git" \ + "$here/6f/.git" "$here" "$here" 6f/sub/sub/ +' + +# case #7: GIT_WORK_TREE overrides core.worktree. test_expect_success '#7: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 7 7/sub 7/sub/sub 7.wt 7.wt/sub 7/wt 7/wt/sub && - cd 7 && - git init && - git config core.worktree non-existent && - cd .. -' - -test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' - cat >7/expected <7/expected <7/expected <7/expected <7/sub/sub/expected <7/sub/sub/expected <7/sub/expected <7/sub/sub/expected <7/expected <7/expected <7/expected <7/expected <7/sub/sub/expected <7/sub/sub/expected <7/sub/sub/expected <7/sub/sub/expected <7/expected <7/expected <7/expected <7/expected <7/sub/sub/expected <7/sub/sub/expected <7/sub/sub/expected <7/sub/sub/expected <.git && - cd .. -' - -test_expect_success '#8: at root' ' - cat >8/expected <8/sub/expected <.git && - GIT_WORK_TREE=non-existent && - export GIT_WORK_TREE && - cd .. -' - -test_expect_success '#9: at root' ' - cat >9/expected <9/sub/expected <.git && - cd .. + setup_repo 7 non-existent "" unset && + mkdir -p 7/sub/sub 7/wt/sub ' +run_wt_tests 7 -test_expect_success '#10: at root' ' - cat >10/expected <10/sub/expected <10/expected <10/sub/expected <.git && - cd .. -' - -test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' - cat >11/expected <11/expected <11/expected <11/expected <11/sub/sub/expected <11/sub/sub/expected <11/sub/expected <11/sub/sub/expected <11/expected <11/expected <11/expected <11/expected <11/sub/sub/expected <11/sub/sub/expected <11/sub/sub/expected <11/sub/sub/expected <11/expected <11/expected <11/expected <result + ) && + ( + cd 22 && + GIT_DIR=.git && + export GIT_DIR && + test_must_fail git symbolic-ref HEAD 2>result + ) && + grep "core.bare and core.worktree" 22/.git/result && + grep "core.bare and core.worktree" 22/result ' -test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=.. at root' ' - cat >11/expected <11/sub/sub/expected <11/sub/sub/expected <11/sub/sub/expected < gitfile case)' ' + try_repo 26 unset "$here/26/.git" unset gitfile true \ + "$here/26.git" "(null)" "$here/26" "(null)" \ + "$here/26.git" "(null)" "$here/26/sub" "(null)" && + try_repo 26b unset .git unset gitfile true \ + "$here/26b.git" "(null)" "$here/26b" "(null)" \ + "$here/26b.git" "(null)" "$here/26b/sub" "(null)" ' -test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=.. in subdir' ' - cat >11/sub/sub/expected <.git && - cd .. +test_expect_success '#28: core.worktree ignored if GIT_DIR unset (bare gitfile case)' ' + try_repo 28 unset unset non-existent gitfile true \ + "$here/28.git" "(null)" "$here/28" "(null)" \ + "$here/28.git" "(null)" "$here/28/sub" "(null)" ' -test_expect_success '#12: at root' ' - cat >12/expected <12/sub/expected <result + ) && + grep "core.bare and core.worktree" 30/result ' -# -# case #13 -# -############################################################ -# -# Input: -# -# - GIT_WORK_TREE is set -# - GIT_DIR is not set -# - core.worktree is set -# - .git is a file -# - core.bare is not set, cwd is outside .git -# -# Output: -# -# #5 except that git_dir is set by .git file - -test_expect_success '#13: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 13 13/sub 13/sub/sub 13.wt 13.wt/sub 13/wt 13/wt/sub && - cd 13 && - git init && - git config core.worktree non-existent && - GIT_WORK_TREE=non-existent-too && - export GIT_WORK_TREE && - mv .git ../13.git && - echo gitdir: ../13.git >.git && - cd .. -' - -test_expect_success '#13: at root' ' - cat >13/expected <13/sub/expected <.git && - cd .. -' - -test_expect_success '#14: GIT_DIR(rel), core.worktree=../14 at root' ' - cat >14/expected <14/expected <14/expected <14/expected <14/sub/sub/expected <14/sub/sub/expected <14/sub/expected <14/sub/sub/expected <14/expected <14/expected <14/expected <14/expected <14/sub/sub/expected <14/sub/sub/expected <14/sub/sub/expected <14/sub/sub/expected <14/expected <14/expected <14/expected <14/expected <14/sub/sub/expected <14/sub/sub/expected <14/sub/sub/expected <14/sub/sub/expected <.git && - cd .. -' - -test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' - cat >15/expected <15/expected <15/expected <15/expected <15/sub/sub/expected <15/sub/sub/expected <15/sub/expected <15/sub/sub/expected <15/expected <15/expected <15/expected <15/expected <15/sub/sub/expected <15/sub/sub/expected <15/sub/sub/expected <15/sub/sub/expected <15/expected <15/expected <15/expected <15/expected <15/sub/sub/expected <15/sub/sub/expected <15/sub/sub/expected <15/sub/sub/expected <16/.git/expected <16/.git/wt/expected <16/.git/wt/sub/expected <16/.git/expected <16/.git/wt/expected <16/.git/wt/sub/expected <16/expected <16/sub/expected < #16.1 (with warnings perhaps) - -test_expect_success '#17.1: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 17 17/sub && - cd 17 && - git init && - mkdir .git/wt .git/wt/sub && - GIT_WORK_TREE=non-existent && - export GIT_WORK_TREE && - cd .. -' - -test_expect_success '#17.1: at .git' ' - cat >17/.git/expected <17/.git/wt/expected <17/.git/wt/sub/expected < #16.2 (with warnings perhaps) - -test_expect_success '#17.2: setup' ' - git config --file="$here/17/.git/config" core.bare true -' - -test_expect_success '#17.2: at .git' ' - cat >17/.git/expected <17/.git/wt/expected <17/.git/wt/sub/expected <17/expected <17/sub/expected <18/expected <18/expected <18/sub/expected <18/sub/expected < #3 - -test_expect_success '#19: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 19 19/sub 19/sub/sub 19.wt 19.wt/sub 19/wt 19/wt/sub && - cd 19 && - git init && - git config core.bare true && - cd .. -' - -test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' - cat >19/expected <19/expected <19/expected <19/expected <19/sub/sub/expected <19/sub/sub/expected <19/sub/expected <19/sub/sub/expected <19/expected <19/expected <19/expected <19/expected <19/sub/sub/expected <19/sub/sub/expected <19/sub/sub/expected <19/sub/sub/expected <19/expected <19/expected <19/expected <19/expected <19/sub/sub/expected <19/sub/sub/expected <19/sub/sub/expected <19/sub/sub/expected < #16.1 - -test_expect_success '#20.1: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 20 20/sub && - cd 20 && - git init && - git config core.worktree non-existent && - mkdir .git/wt .git/wt/sub && - cd .. -' - -test_expect_success '#20.1: at .git' ' - cat >20/.git/expected <20/.git/wt/expected <20/.git/wt/sub/expected < #16.2 - -test_expect_success '#20.2: setup' ' - git config --file="$here/20/.git/config" core.bare true -' - -test_expect_success '#20.2: at .git' ' - cat >20/.git/expected <20/.git/wt/expected <20/.git/wt/sub/expected <20/expected <20/sub/expected < #20.1 - -test_expect_success '#21.1: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 21 21/sub && - cd 21 && - git init && - git config core.worktree non-existent && - GIT_WORK_TREE=non-existent-too && - export GIT_WORK_TREE && - mkdir .git/wt .git/wt/sub && - cd .. -' - -test_expect_success '#21.1: at .git' ' - cat >21/.git/expected <21/.git/wt/expected <21/.git/wt/sub/expected < #20.2 - -test_expect_success '#21.2: setup' ' - git config --file="$here/21/.git/config" core.bare true -' - -test_expect_success '#21.2: at .git' ' - cat >21/.git/expected <21/.git/wt/expected <21/.git/wt/sub/expected <21/expected <21/sub/expected <22/.git/expected <22/.git/expected <22/.git/expected <22/.git/expected <22/.git/sub/expected <22/.git/sub/expected <22/.git/sub/expected <22/.git/sub/expected <22/.git/expected <22/.git/expected <22/.git/expected <22/.git/expected <22/.git/sub/expected <22/.git/sub/expected <22/.git/sub/expected <22/.git/sub/expected <22/.git/expected <22/.git/expected <22/.git/expected <22/.git/expected <22/.git/sub/expected <22/.git/sub/expected <22/.git/sub/expected <22/.git/sub/expected <result && - grep "core.bare and core.worktree do not make sense" result - ) -' - -test_expect_success '#22.2: at root' ' - ( - cd 22 && - GIT_DIR=.git && - export GIT_DIR && - test_must_fail git symbolic-ref HEAD 2>result && - grep "core.bare and core.worktree do not make sense" result - ) -' - -# -# case #23 -# -############################################################ -# -# Input: -# -# - GIT_WORK_TREE is set -# - GIT_DIR is set -# - core.worktree is set -# - .git is a directory -# - core.bare is set -# -# Output: -# -# core.worktree is overridden by GIT_WORK_TREE -> #19 - -test_expect_success '#23: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 23 23/sub 23/sub/sub 23.wt 23.wt/sub 23/wt 23/wt/sub && - cd 23 && - git init && - git config core.bare true && - git config core.worktree non-existent && - cd .. -' - -test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' - cat >23/expected <23/expected <23/expected <23/expected <23/sub/sub/expected <23/sub/sub/expected <23/sub/expected <23/sub/sub/expected <23/expected <23/expected <23/expected <23/expected <23/sub/sub/expected <23/sub/sub/expected <23/sub/sub/expected <23/sub/sub/expected <23/expected <23/expected <23/expected <23/expected <23/sub/sub/expected <23/sub/sub/expected <23/sub/sub/expected <23/sub/sub/expected <.git && - cd .. -' - -test_expect_success '#24: at root' ' - cat >24/expected <24/sub/expected <.git && - cd .. -' - -test_expect_success '#25: at root' ' - cat >25/expected <25/sub/expected <.git && - cd .. -' - -test_expect_success '#26: (rel) at root' ' - cat >26/expected <26/expected <26/sub/expected <26/sub/expected <.git && - cd .. -' - -test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' - cat >27/expected <27/expected <27/expected <27/expected <27/sub/sub/expected <27/sub/sub/expected <27/sub/expected <27/sub/sub/expected <27/expected <27/expected <27/expected <27/expected <27/sub/sub/expected <27/sub/sub/expected <27/sub/sub/expected <27/sub/sub/expected <27/expected <27/expected <27/expected <27/expected <27/sub/sub/expected <27/sub/sub/expected <27/sub/sub/expected <27/sub/sub/expected < #24 - -test_expect_success '#28: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 28 28/sub && - cd 28 && - git init && - git config core.bare true && - git config core.worktree non-existent && - mv .git ../28.git && - echo gitdir: ../28.git >.git && - cd .. -' - -test_expect_success '#28: at root' ' - cat >28/expected <28/sub/expected < #28 - -test_expect_success '#29: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 29 29/sub && - cd 29 && - git init && - git config core.bare true && - GIT_WORK_TREE=non-existent && - export GIT_WORK_TREE && - mv .git ../29.git && - echo gitdir: ../29.git >.git && - cd .. -' - -test_expect_success '#29: at root' ' - cat >29/expected <29/sub/expected <.git && - cd .. -' - -test_expect_success '#30: at root' ' - ( - cd 30 && - GIT_DIR=.git && - export GIT_DIR && - test_must_fail git symbolic-ref HEAD 2>result && - grep "core.bare and core.worktree do not make sense" result - ) -' - -# -# case #31 -# -############################################################ -# -# Input: -# -# - GIT_WORK_TREE is set -# - GIT_DIR is set -# - core.worktree is set -# - .git is a file -# - core.bare is set -# -# Output: -# -# #23 except git_dir is set according to .git file - +# Case #31: GIT_DIR + GIT_WORK_TREE(+core.worktree) suppresses +# bareness (gitfile version). test_expect_success '#31: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 31 31/sub 31/sub/sub 31.wt 31.wt/sub 31/wt 31/wt/sub && - cd 31 && - git init && - git config core.bare true && - git config core.worktree non-existent && - mv .git ../31.git && - echo gitdir: ../31.git >.git && - cd .. -' - -test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' - cat >31/expected <31/expected <31/expected <31/expected <31/sub/sub/expected <31/sub/sub/expected <31/sub/expected <31/sub/sub/expected <31/expected <31/expected <31/expected <31/expected <31/sub/sub/expected <31/sub/sub/expected <31/sub/sub/expected <31/sub/sub/expected <31/expected <31/expected <31/expected <31/expected <31/sub/sub/expected <31/sub/sub/expected <31/sub/sub/expected <31/sub/sub/expected <