#!/bin/sh test_description='Tests of cwd/prefix/worktree/gitdir setup in all cases' . ./test-lib.sh # # A few rules for repo setup: # # 1. GIT_DIR is relative to user's cwd. --git-dir is equivalent to # GIT_DIR. # # 2. .git file is relative to parent directory. .git file is basically # symlink in disguise. The directory where .git file points to will # become new git_dir. # # 3. core.worktree is relative to git_dir. # # 4. GIT_WORK_TREE is relative to user's cwd. --work-tree is # equivalent to GIT_WORK_TREE. # # 5. GIT_WORK_TREE/core.worktree is only effective if GIT_DIR is set # Uneffective worktree settings should be warned. # # 6. Effective GIT_WORK_TREE overrides core.worktree and core.bare # # 7. Effective core.worktree conflicts with core.bare # # 8. If GIT_DIR is set but neither worktree nor bare setting is given, # original cwd becomes worktree. # # 9. If .git discovery is done inside a repo, the repo becomes a bare # repo. .git discovery is performed if GIT_DIR is not set. # # 10. If no worktree is available, cwd remains unchanged, prefix is # NULL. # # 11. When user's cwd is outside worktree, cwd remains unchanged, # prefix is NULL. # test_repo() { ( cd "$1" && if test -n "$2"; then GIT_DIR="$2" && export GIT_DIR; fi && if test -n "$3"; then GIT_WORK_TREE="$3" && export GIT_WORK_TREE; fi && rm -f trace && GIT_TRACE="`pwd`/trace" git symbolic-ref HEAD >/dev/null && grep '^setup: ' trace >result && test_cmp expected result ) } # 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 && cd .. ' 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 test_expect_success '#5: setup' ' 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 <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 <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 '#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 .. ' 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 <11/expected <11/sub/sub/expected <11/sub/sub/expected <11/sub/sub/expected <11/sub/sub/expected <.git && cd .. ' test_expect_success '#12: at root' ' cat >12/expected <12/sub/expected <.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="$TRASH_DIRECTORY/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="$TRASH_DIRECTORY/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="$TRASH_DIRECTORY/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 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 <