diff options
Diffstat (limited to 't')
-rw-r--r-- | t/lib-git-svn.sh | 49 | ||||
-rwxr-xr-x | t/t0001-init.sh | 56 | ||||
-rwxr-xr-x | t/t1011-read-tree-sparse-checkout.sh | 14 | ||||
-rwxr-xr-x | t/t1020-subdirectory.sh | 8 | ||||
-rwxr-xr-x | t/t1501-worktree.sh | 7 | ||||
-rwxr-xr-x | t/t1510-repo-setup.sh | 4532 | ||||
-rwxr-xr-x | t/t3404-rebase-interactive.sh | 3 | ||||
-rwxr-xr-x | t/t3600-rm.sh | 2 | ||||
-rwxr-xr-x | t/t4151-am-abort.sh | 9 | ||||
-rwxr-xr-x | t/t5407-post-rewrite-hook.sh | 18 | ||||
-rwxr-xr-x | t/t7501-commit.sh | 4 | ||||
-rwxr-xr-x | t/t9001-send-email.sh | 6 | ||||
-rwxr-xr-x | t/t9142-git-svn-shallow-clone.sh | 5 | ||||
-rwxr-xr-x | t/t9501-gitweb-standalone-http-status.sh | 2 | ||||
-rwxr-xr-x | t/t9600-cvsimport.sh | 7 | ||||
-rw-r--r-- | t/test-lib.sh | 2 |
16 files changed, 4690 insertions, 34 deletions
diff --git a/t/lib-git-svn.sh b/t/lib-git-svn.sh index 92d6d3194..6a9d97572 100644 --- a/t/lib-git-svn.sh +++ b/t/lib-git-svn.sh @@ -68,28 +68,41 @@ svn_cmd () { svn "$orig_svncmd" --config-dir "$svnconf" "$@" } -for d in \ - "$SVN_HTTPD_PATH" \ - /usr/sbin/apache2 \ - /usr/sbin/httpd \ -; do - if test -f "$d" +if test -n "$SVN_HTTPD_PORT" +then + for d in \ + "$SVN_HTTPD_PATH" \ + /usr/sbin/apache2 \ + /usr/sbin/httpd \ + ; do + if test -f "$d" + then + SVN_HTTPD_PATH="$d" + break + fi + done + if test -z "$SVN_HTTPD_PATH" then - SVN_HTTPD_PATH="$d" - break + skip_all='skipping git svn tests, Apache not found' + test_done fi -done -for d in \ - "$SVN_HTTPD_MODULE_PATH" \ - /usr/lib/apache2/modules \ - /usr/libexec/apache2 \ -; do - if test -d "$d" + for d in \ + "$SVN_HTTPD_MODULE_PATH" \ + /usr/lib/apache2/modules \ + /usr/libexec/apache2 \ + ; do + if test -d "$d" + then + SVN_HTTPD_MODULE_PATH="$d" + break + fi + done + if test -z "$SVN_HTTPD_MODULE_PATH" then - SVN_HTTPD_MODULE_PATH="$d" - break + skip_all='skipping git svn tests, Apache module dir not found' + test_done fi -done +fi start_httpd () { repo_base_path="$1" diff --git a/t/t0001-init.sh b/t/t0001-init.sh index d44194c35..af8b9c52a 100755 --- a/t/t0001-init.sh +++ b/t/t0001-init.sh @@ -33,6 +33,62 @@ test_expect_success 'plain' ' check_config plain/.git false unset ' +test_expect_success 'plain nested in bare' ' + ( + unset GIT_DIR GIT_WORK_TREE && + git init --bare bare-ancestor.git && + cd bare-ancestor.git && + mkdir plain-nested && + cd plain-nested && + git init + ) && + check_config bare-ancestor.git/plain-nested/.git false unset +' + +test_expect_success 'plain through aliased command, outside any git repo' ' + ( + unset GIT_DIR GIT_WORK_TREE GIT_CONFIG_NOGLOBAL && + HOME=$(pwd)/alias-config && + export HOME && + mkdir alias-config && + echo "[alias] aliasedinit = init" >alias-config/.gitconfig && + + GIT_CEILING_DIRECTORIES=$(pwd) && + export GIT_CEILING_DIRECTORIES && + + mkdir plain-aliased && + cd plain-aliased && + git aliasedinit + ) && + check_config plain-aliased/.git false unset +' + +test_expect_failure 'plain nested through aliased command' ' + ( + unset GIT_DIR GIT_WORK_TREE && + git init plain-ancestor-aliased && + cd plain-ancestor-aliased && + echo "[alias] aliasedinit = init" >>.git/config && + mkdir plain-nested && + cd plain-nested && + git aliasedinit + ) && + check_config plain-ancestor-aliased/plain-nested/.git false unset +' + +test_expect_failure 'plain nested in bare through aliased command' ' + ( + unset GIT_DIR GIT_WORK_TREE && + git init --bare bare-ancestor-aliased.git && + cd bare-ancestor-aliased.git && + echo "[alias] aliasedinit = init" >>config && + mkdir plain-nested && + cd plain-nested && + git aliasedinit + ) && + check_config bare-ancestor-aliased.git/plain-nested/.git false unset +' + test_expect_success 'plain with GIT_WORK_TREE' ' if ( sane_unset GIT_DIR && diff --git a/t/t1011-read-tree-sparse-checkout.sh b/t/t1011-read-tree-sparse-checkout.sh index 0ef11bccb..de84e35c4 100755 --- a/t/t1011-read-tree-sparse-checkout.sh +++ b/t/t1011-read-tree-sparse-checkout.sh @@ -94,12 +94,20 @@ test_expect_success 'match directories with trailing slash' ' test -f sub/added ' -test_expect_failure 'match directories without trailing slash' ' - echo init.t >.git/info/sparse-checkout && +test_expect_success 'match directories without trailing slash' ' echo sub >>.git/info/sparse-checkout && git read-tree -m -u HEAD && git ls-files -t >result && - test_cmp expected.swt result && + test_cmp expected.swt-noinit result && + test ! -f init.t && + test -f sub/added +' + +test_expect_success 'match directory pattern' ' + echo "s?b" >>.git/info/sparse-checkout && + git read-tree -m -u HEAD && + git ls-files -t >result && + test_cmp expected.swt-noinit result && test ! -f init.t && test -f sub/added ' diff --git a/t/t1020-subdirectory.sh b/t/t1020-subdirectory.sh index a3ac33801..1fd187c5e 100755 --- a/t/t1020-subdirectory.sh +++ b/t/t1020-subdirectory.sh @@ -110,6 +110,14 @@ test_expect_success 'read-tree' ' ) ' +test_expect_success 'alias expansion' ' + ( + git config alias.ss status && + cd dir && + git status && + git ss + ) +' test_expect_success 'no file/rev ambiguity check inside .git' ' git commit -a -m 1 && ( diff --git a/t/t1501-worktree.sh b/t/t1501-worktree.sh index 2c8f01f66..f072a8ed4 100755 --- a/t/t1501-worktree.sh +++ b/t/t1501-worktree.sh @@ -340,4 +340,11 @@ test_expect_success 'make_relative_path handles double slashes in GIT_DIR' ' git --git-dir="$(pwd)//repo.git" --work-tree="$(pwd)" add dummy_file ' +test_expect_success 'relative $GIT_WORK_TREE and git subprocesses' ' + GIT_DIR=repo.git GIT_WORK_TREE=repo.git/work \ + test-subprocess --setup-work-tree rev-parse --show-toplevel >actual && + echo "$TRASH_DIRECTORY/repo.git/work" >expected && + test_cmp expected actual +' + test_done diff --git a/t/t1510-repo-setup.sh b/t/t1510-repo-setup.sh new file mode 100755 index 000000000..500ffafc2 --- /dev/null +++ b/t/t1510-repo-setup.sh @@ -0,0 +1,4532 @@ +#!/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' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 0 0/sub && + cd 0 && git init && cd .. +' + +test_expect_success '#0: at root' ' + cat >0/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/0 +setup: cwd: $TRASH_DIRECTORY/0 +setup: prefix: (null) +EOF + test_repo 0 +' + +test_expect_success '#0: in subdir' ' + cat >0/sub/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/0 +setup: cwd: $TRASH_DIRECTORY/0 +setup: prefix: sub/ +EOF + test_repo 0/sub +' + +# +# case #1 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is 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: +# +# GIT_WORK_TREE is ignored -> #0 + +test_expect_success '#1: setup' ' + 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 <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/1 +setup: cwd: $TRASH_DIRECTORY/1 +setup: prefix: (null) +EOF + test_repo 1 +' + +test_expect_success '#1: in subdir' ' + cat >1/sub/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/1 +setup: cwd: $TRASH_DIRECTORY/1 +setup: prefix: sub/ +EOF + test_repo 1/sub +' + +# +# case #2 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is not set +# - GIT_DIR is set +# - core.worktree is not set +# - .git is a directory +# - core.bare is not set, cwd is outside .git +# +# Output: +# +# - worktree is at original cwd +# - cwd is unchanged +# - prefix is NULL +# - git_dir is set to $GIT_DIR +# - cwd can't be outside worktree + +test_expect_success '#2: setup' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 2 2/sub && + cd 2 && git init && cd .. +' + +test_expect_success '#2: at root' ' + cat >2/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/2/.git +setup: worktree: $TRASH_DIRECTORY/2 +setup: cwd: $TRASH_DIRECTORY/2 +setup: prefix: (null) +EOF + test_repo 2 "$TRASH_DIRECTORY/2/.git" +' + +test_expect_success '#2: in subdir' ' + cat >2/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/2/.git +setup: worktree: $TRASH_DIRECTORY/2/sub +setup: cwd: $TRASH_DIRECTORY/2/sub +setup: prefix: (null) +EOF + test_repo 2/sub "$TRASH_DIRECTORY/2/.git" +' + +test_expect_success '#2: relative GIT_DIR at root' ' + cat >2/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/2 +setup: cwd: $TRASH_DIRECTORY/2 +setup: prefix: (null) +EOF + test_repo 2 .git +' + +test_expect_success '#2: relative GIT_DIR in subdir' ' + cat >2/sub/expected <<EOF && +setup: git_dir: ../.git +setup: worktree: $TRASH_DIRECTORY/2/sub +setup: cwd: $TRASH_DIRECTORY/2/sub +setup: prefix: (null) +EOF + test_repo 2/sub ../.git +' + +# +# case #3 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is set +# - GIT_DIR is set +# - core.worktree is not set +# - .git is a directory +# - core.bare is not set, cwd is outside .git +# +# Output: +# +# - worktree is set to $GIT_WORK_TREE +# - cwd is at worktree root +# - prefix is calculated +# - git_dir is set to $GIT_DIR +# - cwd can be outside worktree + +test_expect_success '#3: setup' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 3 3/sub 3/sub/sub 3.wt 3.wt/sub 3/wt 3/wt/sub && + cd 3 && git init && cd .. +' + +test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' + cat >3/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/3 +setup: cwd: $TRASH_DIRECTORY/3 +setup: prefix: (null) +EOF + test_repo 3 .git "$TRASH_DIRECTORY/3" +' + +test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' ' + cat >3/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/3 +setup: cwd: $TRASH_DIRECTORY/3 +setup: prefix: (null) +EOF + test_repo 3 .git . +' + +test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=root at root' ' + cat >3/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY/3 +setup: cwd: $TRASH_DIRECTORY/3 +setup: prefix: (null) +EOF + test_repo 3 "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY/3" +' + +test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=root(rel) at root' ' + cat >3/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY/3 +setup: cwd: $TRASH_DIRECTORY/3 +setup: prefix: (null) +EOF + test_repo 3 "$TRASH_DIRECTORY/3/.git" . +' + +test_expect_success '#3: GIT_DIR(rel), GIT_WORKTREE=root in subdir' ' + cat >3/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY/3 +setup: cwd: $TRASH_DIRECTORY/3 +setup: prefix: sub/sub/ +EOF + test_repo 3/sub/sub ../../.git "$TRASH_DIRECTORY/3" +' + +test_expect_success '#3: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' ' + cat >3/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY/3 +setup: cwd: $TRASH_DIRECTORY/3 +setup: prefix: sub/sub/ +EOF + test_repo 3/sub/sub ../../.git ../.. +' + +test_expect_success '#3: GIT_DIR, GIT_WORKTREE=root in subdir' ' + cat >3/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY/3 +setup: cwd: $TRASH_DIRECTORY/3 +setup: prefix: sub/ +EOF + test_repo 3/sub "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY/3" +' + +test_expect_success '#3: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' ' + cat >3/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY/3 +setup: cwd: $TRASH_DIRECTORY/3 +setup: prefix: sub/sub/ +EOF + test_repo 3/sub/sub "$TRASH_DIRECTORY/3/.git" ../.. +' + +test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=wt at root' ' + cat >3/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/3/wt +setup: cwd: $TRASH_DIRECTORY/3 +setup: prefix: (null) +EOF + test_repo 3 .git "$TRASH_DIRECTORY/3/wt" +' + +test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' ' + cat >3/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/3/wt +setup: cwd: $TRASH_DIRECTORY/3 +setup: prefix: (null) +EOF + test_repo 3 .git wt +' + +test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' ' + cat >3/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY/3/wt +setup: cwd: $TRASH_DIRECTORY/3 +setup: prefix: (null) +EOF + test_repo 3 "$TRASH_DIRECTORY/3/.git" wt +' + +test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=wt at root' ' + cat >3/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY/3/wt +setup: cwd: $TRASH_DIRECTORY/3 +setup: prefix: (null) +EOF + test_repo 3 "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY/3/wt" +' + +test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' ' + cat >3/sub/sub/expected <<EOF && +setup: git_dir: ../../.git +setup: worktree: $TRASH_DIRECTORY/3/wt +setup: cwd: $TRASH_DIRECTORY/3/sub/sub +setup: prefix: (null) +EOF + test_repo 3/sub/sub ../../.git "$TRASH_DIRECTORY/3/wt" +' + +test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' ' + cat >3/sub/sub/expected <<EOF && +setup: git_dir: ../../.git +setup: worktree: $TRASH_DIRECTORY/3/wt +setup: cwd: $TRASH_DIRECTORY/3/sub/sub +setup: prefix: (null) +EOF + test_repo 3/sub/sub ../../.git ../../wt +' + +test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' ' + cat >3/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY/3/wt +setup: cwd: $TRASH_DIRECTORY/3/sub/sub +setup: prefix: (null) +EOF + test_repo 3/sub/sub "$TRASH_DIRECTORY/3/.git" ../../wt +' + +test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=wt in subdir' ' + cat >3/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY/3/wt +setup: cwd: $TRASH_DIRECTORY/3/sub/sub +setup: prefix: (null) +EOF + test_repo 3/sub/sub "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY/3/wt" +' + +test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=.. at root' ' + cat >3/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 3/ +EOF + test_repo 3 .git "$TRASH_DIRECTORY" +' + +test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' ' + cat >3/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 3/ +EOF + test_repo 3 .git .. +' + +test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=..(rel) at root' ' + cat >3/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 3/ +EOF + test_repo 3 "$TRASH_DIRECTORY/3/.git" .. +' + +test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=.. at root' ' + cat >3/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 3/ +EOF + test_repo 3 "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY" +' + +test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' ' + cat >3/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 3/sub/sub/ +EOF + test_repo 3/sub/sub ../../.git "$TRASH_DIRECTORY" +' + +test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' ' + cat >3/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 3/sub/sub/ +EOF + test_repo 3/sub/sub ../../.git ../../.. +' + +test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' ' + cat >3/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 3/sub/sub/ +EOF + test_repo 3/sub/sub "$TRASH_DIRECTORY/3/.git" ../../../ +' + +test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=.. in subdir' ' + cat >3/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/3/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 3/sub/sub/ +EOF + test_repo 3/sub/sub "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY" +' + +# +# case #4 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is not set +# - GIT_DIR is not set +# - core.worktree is set +# - .git is a directory +# - core.bare is not set, cwd is outside .git +# +# Output: +# +# core.worktree is ignored -> #0 + +test_expect_success '#4: setup' ' + 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 <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/4 +setup: cwd: $TRASH_DIRECTORY/4 +setup: prefix: (null) +EOF + test_repo 4 +' + +test_expect_success '#4: in subdir' ' + cat >4/sub/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/4 +setup: cwd: $TRASH_DIRECTORY/4 +setup: prefix: sub/ +EOF + test_repo 4/sub +' + +# +# case #5 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is set +# - GIT_DIR is not set +# - core.worktree is set +# - .git is a directory +# - core.bare is not set, cwd is outside .git +# +# Output: +# +# GIT_WORK_TREE/core.worktree are ignored -> #0 + +test_expect_success '#5: setup' ' + 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 <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/5 +setup: cwd: $TRASH_DIRECTORY/5 +setup: prefix: (null) +EOF + test_repo 5 +' + +test_expect_success '#5: in subdir' ' + cat >5/sub/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/5 +setup: cwd: $TRASH_DIRECTORY/5 +setup: prefix: sub/ +EOF + test_repo 5/sub +' + +# +# 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 + +test_expect_success '#6: setup' ' + 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 <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/6 +setup: cwd: $TRASH_DIRECTORY/6 +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6" && + test_repo 6 .git +' + +test_expect_success '#6: GIT_DIR(rel), core.worktree=..(rel) at root' ' + cat >6/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/6 +setup: cwd: $TRASH_DIRECTORY/6 +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree .. && + test_repo 6 .git +' + +test_expect_success '#6: GIT_DIR, core.worktree=.. at root' ' + cat >6/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY/6 +setup: cwd: $TRASH_DIRECTORY/6 +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6" && + test_repo 6 "$TRASH_DIRECTORY/6/.git" +' + +test_expect_success '#6: GIT_DIR, core.worktree=..(rel) at root' ' + cat >6/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY/6 +setup: cwd: $TRASH_DIRECTORY/6 +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree .. && + test_repo 6 "$TRASH_DIRECTORY/6/.git" +' + +test_expect_success '#6: GIT_DIR(rel), core.worktree=.. in subdir' ' + cat >6/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY/6 +setup: cwd: $TRASH_DIRECTORY/6 +setup: prefix: sub/sub/ +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6" && + test_repo 6/sub/sub ../../.git +' + +test_expect_success '#6: GIT_DIR(rel), core.worktree=..(rel) in subdir' ' + cat >6/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY/6 +setup: cwd: $TRASH_DIRECTORY/6 +setup: prefix: sub/sub/ +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree .. && + test_repo 6/sub/sub ../../.git +' + +test_expect_success '#6: GIT_DIR, core.worktree=.. in subdir' ' + cat >6/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY/6 +setup: cwd: $TRASH_DIRECTORY/6 +setup: prefix: sub/ +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6" && + test_repo 6/sub "$TRASH_DIRECTORY/6/.git" +' + +test_expect_success '#6: GIT_DIR, core.worktree=..(rel) in subdir' ' + cat >6/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY/6 +setup: cwd: $TRASH_DIRECTORY/6 +setup: prefix: sub/sub/ +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree .. && + test_repo 6/sub/sub "$TRASH_DIRECTORY/6/.git" +' + +test_expect_success '#6: GIT_DIR(rel), core.worktree=../wt at root' ' + cat >6/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/6/wt +setup: cwd: $TRASH_DIRECTORY/6 +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6/wt" && + test_repo 6 .git +' + +test_expect_success '#6: GIT_DIR(rel), core.worktree=../wt(rel) at root' ' + cat >6/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/6/wt +setup: cwd: $TRASH_DIRECTORY/6 +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../wt && + test_repo 6 .git +' + +test_expect_success '#6: GIT_DIR, core.worktree=../wt(rel) at root' ' + cat >6/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY/6/wt +setup: cwd: $TRASH_DIRECTORY/6 +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../wt && + test_repo 6 "$TRASH_DIRECTORY/6/.git" +' + +test_expect_success '#6: GIT_DIR, core.worktree=../wt at root' ' + cat >6/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY/6/wt +setup: cwd: $TRASH_DIRECTORY/6 +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6/wt" && + test_repo 6 "$TRASH_DIRECTORY/6/.git" +' + +test_expect_success '#6: GIT_DIR(rel), core.worktree=../wt in subdir' ' + cat >6/sub/sub/expected <<EOF && +setup: git_dir: ../../.git +setup: worktree: $TRASH_DIRECTORY/6/wt +setup: cwd: $TRASH_DIRECTORY/6/sub/sub +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6/wt" && + test_repo 6/sub/sub ../../.git +' + +test_expect_success '#6: GIT_DIR(rel), core.worktree=../wt(rel) in subdir' ' + cat >6/sub/sub/expected <<EOF && +setup: git_dir: ../../.git +setup: worktree: $TRASH_DIRECTORY/6/wt +setup: cwd: $TRASH_DIRECTORY/6/sub/sub +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../wt && + test_repo 6/sub/sub ../../.git +' + +test_expect_success '#6: GIT_DIR, core.worktree=../wt(rel) in subdir' ' + cat >6/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY/6/wt +setup: cwd: $TRASH_DIRECTORY/6/sub/sub +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../wt && + test_repo 6/sub/sub "$TRASH_DIRECTORY/6/.git" +' + +test_expect_success '#6: GIT_DIR, core.worktree=../wt in subdir' ' + cat >6/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY/6/wt +setup: cwd: $TRASH_DIRECTORY/6/sub/sub +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6/wt" && + test_repo 6/sub/sub "$TRASH_DIRECTORY/6/.git" +' + +test_expect_success '#6: GIT_DIR(rel), core.worktree=../.. at root' ' + cat >6/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 6/ +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY" && + test_repo 6 .git +' + +test_expect_success '#6: GIT_DIR(rel), core.worktree=../..(rel) at root' ' + cat >6/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 6/ +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../../ && + test_repo 6 .git +' + +test_expect_success '#6: GIT_DIR, core.worktree=../..(rel) at root' ' + cat >6/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 6/ +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../../ && + test_repo 6 "$TRASH_DIRECTORY/6/.git" +' + +test_expect_success '#6: GIT_DIR, core.worktree=../.. at root' ' + cat >6/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 6/ +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY" && + test_repo 6 "$TRASH_DIRECTORY/6/.git" +' + +test_expect_success '#6: GIT_DIR(rel), core.worktree=../.. in subdir' ' + cat >6/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 6/sub/sub/ +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY" && + test_repo 6/sub/sub ../../.git +' + +test_expect_success '#6: GIT_DIR(rel), core.worktree=../..(rel) in subdir' ' + cat >6/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 6/sub/sub/ +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../.. && + test_repo 6/sub/sub ../../.git +' + +test_expect_success '#6: GIT_DIR, core.worktree=../..(rel) in subdir' ' + cat >6/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 6/sub/sub/ +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../.. && + test_repo 6/sub/sub "$TRASH_DIRECTORY/6/.git" +' + +test_expect_success '#6: GIT_DIR, core.worktree=../.. in subdir' ' + cat >6/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/6/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 6/sub/sub/ +EOF + git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY" && + test_repo 6/sub/sub "$TRASH_DIRECTORY/6/.git" +' + +# +# case #7 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is set +# - GIT_DIR is set +# - core.worktree is set +# - .git is a directory +# - core.bare is not set, cwd is outside .git +# +# Output: +# +# core.worktree is overridden by GIT_WORK_TREE -> #3 + +test_expect_success '#7: setup' ' + 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 <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/7 +setup: cwd: $TRASH_DIRECTORY/7 +setup: prefix: (null) +EOF + test_repo 7 .git "$TRASH_DIRECTORY/7" +' + +test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' ' + cat >7/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/7 +setup: cwd: $TRASH_DIRECTORY/7 +setup: prefix: (null) +EOF + test_repo 7 .git . +' + +test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=root at root' ' + cat >7/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY/7 +setup: cwd: $TRASH_DIRECTORY/7 +setup: prefix: (null) +EOF + test_repo 7 "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY/7" +' + +test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=root(rel) at root' ' + cat >7/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY/7 +setup: cwd: $TRASH_DIRECTORY/7 +setup: prefix: (null) +EOF + test_repo 7 "$TRASH_DIRECTORY/7/.git" . +' + +test_expect_success '#7: GIT_DIR(rel), GIT_WORKTREE=root in subdir' ' + cat >7/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY/7 +setup: cwd: $TRASH_DIRECTORY/7 +setup: prefix: sub/sub/ +EOF + test_repo 7/sub/sub ../../.git "$TRASH_DIRECTORY/7" +' + +test_expect_success '#7: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' ' + cat >7/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY/7 +setup: cwd: $TRASH_DIRECTORY/7 +setup: prefix: sub/sub/ +EOF + test_repo 7/sub/sub ../../.git ../.. +' + +test_expect_success '#7: GIT_DIR, GIT_WORKTREE=root in subdir' ' + cat >7/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY/7 +setup: cwd: $TRASH_DIRECTORY/7 +setup: prefix: sub/ +EOF + test_repo 7/sub "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY/7" +' + +test_expect_success '#7: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' ' + cat >7/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY/7 +setup: cwd: $TRASH_DIRECTORY/7 +setup: prefix: sub/sub/ +EOF + test_repo 7/sub/sub "$TRASH_DIRECTORY/7/.git" ../.. +' + +test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=wt at root' ' + cat >7/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/7/wt +setup: cwd: $TRASH_DIRECTORY/7 +setup: prefix: (null) +EOF + test_repo 7 .git "$TRASH_DIRECTORY/7/wt" +' + +test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' ' + cat >7/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/7/wt +setup: cwd: $TRASH_DIRECTORY/7 +setup: prefix: (null) +EOF + test_repo 7 .git wt +' + +test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' ' + cat >7/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY/7/wt +setup: cwd: $TRASH_DIRECTORY/7 +setup: prefix: (null) +EOF + test_repo 7 "$TRASH_DIRECTORY/7/.git" wt +' + +test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=wt at root' ' + cat >7/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY/7/wt +setup: cwd: $TRASH_DIRECTORY/7 +setup: prefix: (null) +EOF + test_repo 7 "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY/7/wt" +' + +test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' ' + cat >7/sub/sub/expected <<EOF && +setup: git_dir: ../../.git +setup: worktree: $TRASH_DIRECTORY/7/wt +setup: cwd: $TRASH_DIRECTORY/7/sub/sub +setup: prefix: (null) +EOF + test_repo 7/sub/sub ../../.git "$TRASH_DIRECTORY/7/wt" +' + +test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' ' + cat >7/sub/sub/expected <<EOF && +setup: git_dir: ../../.git +setup: worktree: $TRASH_DIRECTORY/7/wt +setup: cwd: $TRASH_DIRECTORY/7/sub/sub +setup: prefix: (null) +EOF + test_repo 7/sub/sub ../../.git ../../wt +' + +test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' ' + cat >7/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY/7/wt +setup: cwd: $TRASH_DIRECTORY/7/sub/sub +setup: prefix: (null) +EOF + test_repo 7/sub/sub "$TRASH_DIRECTORY/7/.git" ../../wt +' + +test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=wt in subdir' ' + cat >7/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY/7/wt +setup: cwd: $TRASH_DIRECTORY/7/sub/sub +setup: prefix: (null) +EOF + test_repo 7/sub/sub "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY/7/wt" +' + +test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=.. at root' ' + cat >7/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 7/ +EOF + test_repo 7 .git "$TRASH_DIRECTORY" +' + +test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' ' + cat >7/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 7/ +EOF + test_repo 7 .git .. +' + +test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=..(rel) at root' ' + cat >7/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 7/ +EOF + test_repo 7 "$TRASH_DIRECTORY/7/.git" .. +' + +test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=.. at root' ' + cat >7/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 7/ +EOF + test_repo 7 "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY" +' + +test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' ' + cat >7/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 7/sub/sub/ +EOF + test_repo 7/sub/sub ../../.git "$TRASH_DIRECTORY" +' + +test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' ' + cat >7/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 7/sub/sub/ +EOF + test_repo 7/sub/sub ../../.git ../../.. +' + +test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' ' + cat >7/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 7/sub/sub/ +EOF + test_repo 7/sub/sub "$TRASH_DIRECTORY/7/.git" ../../../ +' + +test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=.. in subdir' ' + cat >7/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/7/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 7/sub/sub/ +EOF + test_repo 7/sub/sub "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY" +' + +# +# case #8 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is not set +# - GIT_DIR is not set +# - core.worktree is not set +# - .git is a file +# - core.bare is not set, cwd is outside .git +# +# Output: +# +# #0 except that git_dir is set by .git file + +test_expect_success '#8: setup' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 8 8/sub && + cd 8 && + git init && + mv .git ../8.git && + echo gitdir: ../8.git >.git && + cd .. +' + +test_expect_success '#8: at root' ' + cat >8/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/8.git +setup: worktree: $TRASH_DIRECTORY/8 +setup: cwd: $TRASH_DIRECTORY/8 +setup: prefix: (null) +EOF + test_repo 8 +' + +test_expect_success '#8: in subdir' ' + cat >8/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/8.git +setup: worktree: $TRASH_DIRECTORY/8 +setup: cwd: $TRASH_DIRECTORY/8 +setup: prefix: sub/ +EOF + test_repo 8/sub +' + +# +# case #9 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is set +# - GIT_DIR is not set +# - core.worktree is not set +# - .git is a file +# - core.bare is not set, cwd is outside .git +# +# Output: +# +# #1 except that git_dir is set by .git file + +test_expect_success '#9: setup' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 9 9/sub 9.wt 9.wt/sub 9/wt 9/wt/sub && + cd 9 && + git init && + mv .git ../9.git && + echo gitdir: ../9.git >.git && + GIT_WORK_TREE=non-existent && + export GIT_WORK_TREE && + cd .. +' + +test_expect_success '#9: at root' ' + cat >9/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/9.git +setup: worktree: $TRASH_DIRECTORY/9 +setup: cwd: $TRASH_DIRECTORY/9 +setup: prefix: (null) +EOF + test_repo 9 +' + +test_expect_success '#9: in subdir' ' + cat >9/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/9.git +setup: worktree: $TRASH_DIRECTORY/9 +setup: cwd: $TRASH_DIRECTORY/9 +setup: prefix: sub/ +EOF + test_repo 9/sub +' + +# +# case #10 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is not set +# - GIT_DIR is set +# - core.worktree is not set +# - .git is a file +# - core.bare is not set, cwd is outside .git +# +# Output: +# +# #2 except that git_dir is set by .git file + +test_expect_success '#10: setup' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 10 10/sub && + cd 10 && + git init && + mv .git ../10.git && + echo gitdir: ../10.git >.git && + cd .. +' + +test_expect_success '#10: at root' ' + cat >10/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/10.git +setup: worktree: $TRASH_DIRECTORY/10 +setup: cwd: $TRASH_DIRECTORY/10 +setup: prefix: (null) +EOF + test_repo 10 "$TRASH_DIRECTORY/10/.git" +' + +test_expect_success '#10: in subdir' ' + cat >10/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/10.git +setup: worktree: $TRASH_DIRECTORY/10/sub +setup: cwd: $TRASH_DIRECTORY/10/sub +setup: prefix: (null) +EOF + test_repo 10/sub "$TRASH_DIRECTORY/10/.git" +' + +test_expect_success '#10: relative GIT_DIR at root' ' + cat >10/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/10.git +setup: worktree: $TRASH_DIRECTORY/10 +setup: cwd: $TRASH_DIRECTORY/10 +setup: prefix: (null) +EOF + test_repo 10 .git +' + +test_expect_success '#10: relative GIT_DIR in subdir' ' + cat >10/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/10.git +setup: worktree: $TRASH_DIRECTORY/10/sub +setup: cwd: $TRASH_DIRECTORY/10/sub +setup: prefix: (null) +EOF + test_repo 10/sub ../.git +' + +# +# case #11 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is set +# - GIT_DIR is set +# - core.worktree is not set +# - .git is a file +# - core.bare is not set, cwd is outside .git +# +# Output: +# +# #3 except that git_dir is set by .git file + +test_expect_success '#11: setup' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 11 11/sub 11/sub/sub 11.wt 11.wt/sub 11/wt 11/wt/sub && + cd 11 && + git init && + mv .git ../11.git && + echo gitdir: ../11.git >.git && + cd .. +' + +test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' + cat >11/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY/11 +setup: cwd: $TRASH_DIRECTORY/11 +setup: prefix: (null) +EOF + test_repo 11 .git "$TRASH_DIRECTORY/11" +' + +test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' ' + cat >11/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY/11 +setup: cwd: $TRASH_DIRECTORY/11 +setup: prefix: (null) +EOF + test_repo 11 .git . +' + +test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=root at root' ' + cat >11/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY/11 +setup: cwd: $TRASH_DIRECTORY/11 +setup: prefix: (null) +EOF + test_repo 11 "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY/11" +' + +test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=root(rel) at root' ' + cat >11/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY/11 +setup: cwd: $TRASH_DIRECTORY/11 +setup: prefix: (null) +EOF + test_repo 11 "$TRASH_DIRECTORY/11/.git" . +' + +test_expect_success '#11: GIT_DIR(rel), GIT_WORKTREE=root in subdir' ' + cat >11/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY/11 +setup: cwd: $TRASH_DIRECTORY/11 +setup: prefix: sub/sub/ +EOF + test_repo 11/sub/sub ../../.git "$TRASH_DIRECTORY/11" +' + +test_expect_success '#11: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' ' + cat >11/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY/11 +setup: cwd: $TRASH_DIRECTORY/11 +setup: prefix: sub/sub/ +EOF + test_repo 11/sub/sub ../../.git ../.. +' + +test_expect_success '#11: GIT_DIR, GIT_WORKTREE=root in subdir' ' + cat >11/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY/11 +setup: cwd: $TRASH_DIRECTORY/11 +setup: prefix: sub/ +EOF + test_repo 11/sub "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY/11" +' + +test_expect_success '#11: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' ' + cat >11/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY/11 +setup: cwd: $TRASH_DIRECTORY/11 +setup: prefix: sub/sub/ +EOF + test_repo 11/sub/sub "$TRASH_DIRECTORY/11/.git" ../.. +' + +test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=wt at root' ' + cat >11/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY/11/wt +setup: cwd: $TRASH_DIRECTORY/11 +setup: prefix: (null) +EOF + test_repo 11 .git "$TRASH_DIRECTORY/11/wt" +' + +test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' ' + cat >11/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY/11/wt +setup: cwd: $TRASH_DIRECTORY/11 +setup: prefix: (null) +EOF + test_repo 11 .git wt +' + +test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' ' + cat >11/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY/11/wt +setup: cwd: $TRASH_DIRECTORY/11 +setup: prefix: (null) +EOF + test_repo 11 "$TRASH_DIRECTORY/11/.git" wt +' + +test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=wt at root' ' + cat >11/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY/11/wt +setup: cwd: $TRASH_DIRECTORY/11 +setup: prefix: (null) +EOF + test_repo 11 "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY/11/wt" +' + +test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' ' + cat >11/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY/11/wt +setup: cwd: $TRASH_DIRECTORY/11/sub/sub +setup: prefix: (null) +EOF + test_repo 11/sub/sub ../../.git "$TRASH_DIRECTORY/11/wt" +' + +test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' ' + cat >11/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY/11/wt +setup: cwd: $TRASH_DIRECTORY/11/sub/sub +setup: prefix: (null) +EOF + test_repo 11/sub/sub ../../.git ../../wt +' + +test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' ' + cat >11/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY/11/wt +setup: cwd: $TRASH_DIRECTORY/11/sub/sub +setup: prefix: (null) +EOF + test_repo 11/sub/sub "$TRASH_DIRECTORY/11/.git" ../../wt +' + +test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=wt in subdir' ' + cat >11/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY/11/wt +setup: cwd: $TRASH_DIRECTORY/11/sub/sub +setup: prefix: (null) +EOF + test_repo 11/sub/sub "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY/11/wt" +' + +test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=.. at root' ' + cat >11/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 11/ +EOF + test_repo 11 .git "$TRASH_DIRECTORY" +' + +test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' ' + cat >11/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 11/ +EOF + test_repo 11 .git .. +' + +test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=..(rel) at root' ' + cat >11/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 11/ +EOF + test_repo 11 "$TRASH_DIRECTORY/11/.git" .. +' + +test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=.. at root' ' + cat >11/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 11/ +EOF + test_repo 11 "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY" +' + +test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' ' + cat >11/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 11/sub/sub/ +EOF + test_repo 11/sub/sub ../../.git "$TRASH_DIRECTORY" +' + +test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' ' + cat >11/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 11/sub/sub/ +EOF + test_repo 11/sub/sub ../../.git ../../.. +' + +test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' ' + cat >11/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 11/sub/sub/ +EOF + test_repo 11/sub/sub "$TRASH_DIRECTORY/11/.git" ../../../ +' + +test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=.. in subdir' ' + cat >11/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/11.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 11/sub/sub/ +EOF + test_repo 11/sub/sub "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY" +' + +# +# case #12 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is not set +# - GIT_DIR is not set +# - core.worktree is set +# - .git is a file +# - core.bare is not set, cwd is outside .git +# +# Output: +# +# #4 except that git_dir is set by .git file + + +test_expect_success '#12: setup' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 12 12/sub 12/sub/sub 12.wt 12.wt/sub 12/wt 12/wt/sub && + cd 12 && + git init && + git config core.worktree non-existent && + mv .git ../12.git && + echo gitdir: ../12.git >.git && + cd .. +' + +test_expect_success '#12: at root' ' + cat >12/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/12.git +setup: worktree: $TRASH_DIRECTORY/12 +setup: cwd: $TRASH_DIRECTORY/12 +setup: prefix: (null) +EOF + test_repo 12 +' + +test_expect_success '#12: in subdir' ' + cat >12/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/12.git +setup: worktree: $TRASH_DIRECTORY/12 +setup: cwd: $TRASH_DIRECTORY/12 +setup: prefix: sub/ +EOF + test_repo 12/sub +' + +# +# 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' ' + 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 <<EOF && +setup: git_dir: $TRASH_DIRECTORY/13.git +setup: worktree: $TRASH_DIRECTORY/13 +setup: cwd: $TRASH_DIRECTORY/13 +setup: prefix: (null) +EOF + test_repo 13 +' + +test_expect_success '#13: in subdir' ' + cat >13/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/13.git +setup: worktree: $TRASH_DIRECTORY/13 +setup: cwd: $TRASH_DIRECTORY/13 +setup: prefix: sub/ +EOF + test_repo 13/sub +' + +# +# case #14 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is not set +# - GIT_DIR is set +# - core.worktree is set +# - .git is a file +# - core.bare is not set, cwd is outside .git +# +# Output: +# +# #6 except that git_dir is set by .git file + +test_expect_success '#14: setup' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 14 14/sub 14/sub/sub 14.wt 14.wt/sub 14/wt 14/wt/sub && + cd 14 && + git init && + mv .git ../14.git && + echo gitdir: ../14.git >.git && + cd .. +' + +test_expect_success '#14: GIT_DIR(rel), core.worktree=../14 at root' ' + cat >14/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY/14 +setup: cwd: $TRASH_DIRECTORY/14 +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY/14" && + test_repo 14 .git +' + +test_expect_success '#14: GIT_DIR(rel), core.worktree=../14(rel) at root' ' + cat >14/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY/14 +setup: cwd: $TRASH_DIRECTORY/14 +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree ../14 && + test_repo 14 .git +' + +test_expect_success '#14: GIT_DIR, core.worktree=../14 at root' ' + cat >14/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY/14 +setup: cwd: $TRASH_DIRECTORY/14 +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY/14" && + test_repo 14 "$TRASH_DIRECTORY/14/.git" +' + +test_expect_success '#14: GIT_DIR, core.worktree=../14(rel) at root' ' + cat >14/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY/14 +setup: cwd: $TRASH_DIRECTORY/14 +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree ../14 && + test_repo 14 "$TRASH_DIRECTORY/14/.git" +' + +test_expect_success '#14: GIT_DIR(rel), core.worktree=../14 in subdir' ' + cat >14/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY/14 +setup: cwd: $TRASH_DIRECTORY/14 +setup: prefix: sub/sub/ +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY/14" && + test_repo 14/sub/sub ../../.git +' + +test_expect_success '#14: GIT_DIR(rel), core.worktree=../14(rel) in subdir' ' + cat >14/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY/14 +setup: cwd: $TRASH_DIRECTORY/14 +setup: prefix: sub/sub/ +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree ../14 && + test_repo 14/sub/sub ../../.git +' + +test_expect_success '#14: GIT_DIR, core.worktree=../14 in subdir' ' + cat >14/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY/14 +setup: cwd: $TRASH_DIRECTORY/14 +setup: prefix: sub/ +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY/14" && + test_repo 14/sub "$TRASH_DIRECTORY/14/.git" +' + +test_expect_success '#14: GIT_DIR, core.worktree=../14(rel) in subdir' ' + cat >14/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY/14 +setup: cwd: $TRASH_DIRECTORY/14 +setup: prefix: sub/sub/ +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree ../14 && + test_repo 14/sub/sub "$TRASH_DIRECTORY/14/.git" +' + +test_expect_success '#14: GIT_DIR(rel), core.worktree=../14/wt at root' ' + cat >14/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY/14/wt +setup: cwd: $TRASH_DIRECTORY/14 +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY/14/wt" && + test_repo 14 .git +' + +test_expect_success '#14: GIT_DIR(rel), core.worktree=../14/wt(rel) at root' ' + cat >14/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY/14/wt +setup: cwd: $TRASH_DIRECTORY/14 +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree ../14/wt && + test_repo 14 .git +' + +test_expect_success '#14: GIT_DIR, core.worktree=../14/wt(rel) at root' ' + cat >14/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY/14/wt +setup: cwd: $TRASH_DIRECTORY/14 +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree ../14/wt && + test_repo 14 "$TRASH_DIRECTORY/14/.git" +' + +test_expect_success '#14: GIT_DIR, core.worktree=../14/wt at root' ' + cat >14/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY/14/wt +setup: cwd: $TRASH_DIRECTORY/14 +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY/14/wt" && + test_repo 14 "$TRASH_DIRECTORY/14/.git" +' + +test_expect_success '#14: GIT_DIR(rel), core.worktree=../14/wt in subdir' ' + cat >14/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY/14/wt +setup: cwd: $TRASH_DIRECTORY/14/sub/sub +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY/14/wt" && + test_repo 14/sub/sub ../../.git +' + +test_expect_success '#14: GIT_DIR(rel), core.worktree=../14/wt(rel) in subdir' ' + cat >14/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY/14/wt +setup: cwd: $TRASH_DIRECTORY/14/sub/sub +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree ../14/wt && + test_repo 14/sub/sub ../../.git +' + +test_expect_success '#14: GIT_DIR, core.worktree=../14/wt(rel) in subdir' ' + cat >14/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY/14/wt +setup: cwd: $TRASH_DIRECTORY/14/sub/sub +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree ../14/wt && + test_repo 14/sub/sub "$TRASH_DIRECTORY/14/.git" +' + +test_expect_success '#14: GIT_DIR, core.worktree=../14/wt in subdir' ' + cat >14/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY/14/wt +setup: cwd: $TRASH_DIRECTORY/14/sub/sub +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY/14/wt" && + test_repo 14/sub/sub "$TRASH_DIRECTORY/14/.git" +' + +test_expect_success '#14: GIT_DIR(rel), core.worktree=.. at root' ' + cat >14/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 14/ +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY" && + test_repo 14 .git +' + +test_expect_success '#14: GIT_DIR(rel), core.worktree=..(rel) at root' ' + cat >14/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 14/ +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree .. && + test_repo 14 .git +' + +test_expect_success '#14: GIT_DIR, core.worktree=..(rel) at root' ' + cat >14/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 14/ +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree .. && + test_repo 14 "$TRASH_DIRECTORY/14/.git" +' + +test_expect_success '#14: GIT_DIR, core.worktree=.. at root' ' + cat >14/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 14/ +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY" && + test_repo 14 "$TRASH_DIRECTORY/14/.git" +' + +test_expect_success '#14: GIT_DIR(rel), core.worktree=.. in subdir' ' + cat >14/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 14/sub/sub/ +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY" && + test_repo 14/sub/sub ../../.git +' + +test_expect_success '#14: GIT_DIR(rel), core.worktree=..(rel) in subdir' ' + cat >14/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 14/sub/sub/ +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree .. && + test_repo 14/sub/sub ../../.git +' + +test_expect_success '#14: GIT_DIR, core.worktree=..(rel) in subdir' ' + cat >14/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 14/sub/sub/ +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree .. && + test_repo 14/sub/sub "$TRASH_DIRECTORY/14/.git" +' + +test_expect_success '#14: GIT_DIR, core.worktree=.. in subdir' ' + cat >14/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/14.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 14/sub/sub/ +EOF + git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY" && + test_repo 14/sub/sub "$TRASH_DIRECTORY/14/.git" +' + +# +# case #15 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is set +# - GIT_DIR is set +# - core.worktree is set +# - .git is a file +# - core.bare is not set, cwd is outside .git +# +# Output: +# +# #7 except that git_dir is set by .git file + +test_expect_success '#15: setup' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 15 15/sub 15/sub/sub 15.wt 15.wt/sub 15/wt 15/wt/sub && + cd 15 && + git init && + git config core.worktree non-existent && + mv .git ../15.git && + echo gitdir: ../15.git >.git && + cd .. +' + +test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' + cat >15/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY/15 +setup: cwd: $TRASH_DIRECTORY/15 +setup: prefix: (null) +EOF + test_repo 15 .git "$TRASH_DIRECTORY/15" +' + +test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' ' + cat >15/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY/15 +setup: cwd: $TRASH_DIRECTORY/15 +setup: prefix: (null) +EOF + test_repo 15 .git . +' + +test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=root at root' ' + cat >15/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY/15 +setup: cwd: $TRASH_DIRECTORY/15 +setup: prefix: (null) +EOF + test_repo 15 "$TRASH_DIRECTORY/15/.git" "$TRASH_DIRECTORY/15" +' + +test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=root(rel) at root' ' + cat >15/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY/15 +setup: cwd: $TRASH_DIRECTORY/15 +setup: prefix: (null) +EOF + test_repo 15 "$TRASH_DIRECTORY/15/.git" . +' + +test_expect_success '#15: GIT_DIR(rel), GIT_WORKTREE=root in subdir' ' + cat >15/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY/15 +setup: cwd: $TRASH_DIRECTORY/15 +setup: prefix: sub/sub/ +EOF + test_repo 15/sub/sub ../../.git "$TRASH_DIRECTORY/15" +' + +test_expect_success '#15: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' ' + cat >15/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY/15 +setup: cwd: $TRASH_DIRECTORY/15 +setup: prefix: sub/sub/ +EOF + test_repo 15/sub/sub ../../.git ../.. +' + +test_expect_success '#15: GIT_DIR, GIT_WORKTREE=root in subdir' ' + cat >15/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY/15 +setup: cwd: $TRASH_DIRECTORY/15 +setup: prefix: sub/ +EOF + test_repo 15/sub "$TRASH_DIRECTORY/15/.git" "$TRASH_DIRECTORY/15" +' + +test_expect_success '#15: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' ' + cat >15/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY/15 +setup: cwd: $TRASH_DIRECTORY/15 +setup: prefix: sub/sub/ +EOF + test_repo 15/sub/sub "$TRASH_DIRECTORY/15/.git" ../.. +' + +test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=wt at root' ' + cat >15/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY/15/wt +setup: cwd: $TRASH_DIRECTORY/15 +setup: prefix: (null) +EOF + test_repo 15 .git "$TRASH_DIRECTORY/15/wt" +' + +test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' ' + cat >15/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY/15/wt +setup: cwd: $TRASH_DIRECTORY/15 +setup: prefix: (null) +EOF + test_repo 15 .git wt +' + +test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' ' + cat >15/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY/15/wt +setup: cwd: $TRASH_DIRECTORY/15 +setup: prefix: (null) +EOF + test_repo 15 "$TRASH_DIRECTORY/15/.git" wt +' + +test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=wt at root' ' + cat >15/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY/15/wt +setup: cwd: $TRASH_DIRECTORY/15 +setup: prefix: (null) +EOF + test_repo 15 "$TRASH_DIRECTORY/15/.git" "$TRASH_DIRECTORY/15/wt" +' + +test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' ' + cat >15/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY/15/wt +setup: cwd: $TRASH_DIRECTORY/15/sub/sub +setup: prefix: (null) +EOF + test_repo 15/sub/sub ../../.git "$TRASH_DIRECTORY/15/wt" +' + +test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' ' + cat >15/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY/15/wt +setup: cwd: $TRASH_DIRECTORY/15/sub/sub +setup: prefix: (null) +EOF + test_repo 15/sub/sub ../../.git ../../wt +' + +test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' ' + cat >15/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY/15/wt +setup: cwd: $TRASH_DIRECTORY/15/sub/sub +setup: prefix: (null) +EOF + test_repo 15/sub/sub "$TRASH_DIRECTORY/15/.git" ../../wt +' + +test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=wt in subdir' ' + cat >15/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY/15/wt +setup: cwd: $TRASH_DIRECTORY/15/sub/sub +setup: prefix: (null) +EOF + test_repo 15/sub/sub "$TRASH_DIRECTORY/15/.git" "$TRASH_DIRECTORY/15/wt" +' + +test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=.. at root' ' + cat >15/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 15/ +EOF + test_repo 15 .git "$TRASH_DIRECTORY" +' + +test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' ' + cat >15/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 15/ +EOF + test_repo 15 .git .. +' + +test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=..(rel) at root' ' + cat >15/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 15/ +EOF + test_repo 15 "$TRASH_DIRECTORY/15/.git" .. +' + +test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=.. at root' ' + cat >15/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 15/ +EOF + test_repo 15 "$TRASH_DIRECTORY/15/.git" "$TRASH_DIRECTORY" +' + +test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' ' + cat >15/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 15/sub/sub/ +EOF + test_repo 15/sub/sub ../../.git "$TRASH_DIRECTORY" +' + +test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' ' + cat >15/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 15/sub/sub/ +EOF + test_repo 15/sub/sub ../../.git ../../.. +' + +test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' ' + cat >15/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 15/sub/sub/ +EOF + test_repo 15/sub/sub "$TRASH_DIRECTORY/15/.git" ../../../ +' + +test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=.. in subdir' ' + cat >15/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/15.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 15/sub/sub/ +EOF + test_repo 15/sub/sub "$TRASH_DIRECTORY/15/.git" "$TRASH_DIRECTORY" +' + +# +# case #16.1 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is not set +# - GIT_DIR is not set +# - core.worktree is not set +# - .git is a directory +# - cwd is inside .git +# +# Output: +# +# - no worktree +# - cwd is unchanged +# - prefix is NULL +# - git_dir is set +# - cwd can't be outside worktree + +test_expect_success '#16.1: setup' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 16 16/sub && + cd 16 && + git init && + mkdir .git/wt .git/wt/sub && + cd .. +' + +test_expect_success '#16.1: at .git' ' + cat >16/.git/expected <<EOF && +setup: git_dir: . +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/16/.git +setup: prefix: (null) +EOF + test_repo 16/.git +' + +test_expect_success '#16.1: in .git/wt' ' + cat >16/.git/wt/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/16/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/16/.git/wt +setup: prefix: (null) +EOF + test_repo 16/.git/wt +' + +test_expect_success '#16.1: in .git/wt/sub' ' + cat >16/.git/wt/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/16/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/16/.git/wt/sub +setup: prefix: (null) +EOF + test_repo 16/.git/wt/sub +' + +# +# case #16.2 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is not set +# - GIT_DIR is not set +# - core.worktree is not set +# - .git is a directory +# - core.bare is set +# +# Output: +# +# - no worktree +# - cwd is unchanged +# - prefix is NULL +# - git_dir is set +# - cwd can't be outside worktree + +test_expect_success '#16.2: setup' ' + git config --file="$TRASH_DIRECTORY/16/.git/config" core.bare true +' + +test_expect_success '#16.2: at .git' ' + cat >16/.git/expected <<EOF && +setup: git_dir: . +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/16/.git +setup: prefix: (null) +EOF + test_repo 16/.git +' + +test_expect_success '#16.2: in .git/wt' ' + cat >16/.git/wt/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/16/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/16/.git/wt +setup: prefix: (null) +EOF + test_repo 16/.git/wt +' + +test_expect_success '#16.2: in .git/wt/sub' ' + cat >16/.git/wt/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/16/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/16/.git/wt/sub +setup: prefix: (null) +EOF + test_repo 16/.git/wt/sub +' + +test_expect_success '#16.2: at root' ' + cat >16/expected <<EOF && +setup: git_dir: .git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/16 +setup: prefix: (null) +EOF + test_repo 16 +' + +test_expect_success '#16.2: in subdir' ' + cat >16/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/16/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/16/sub +setup: prefix: (null) +EOF + test_repo 16/sub +' + +# +# case #17.1 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is set +# - GIT_DIR is not set +# - core.worktree is not set +# - .git is a directory +# - cwd is inside .git +# +# Output: +# +# GIT_WORK_TREE is ignored -> #16.1 (with warnings perhaps) + +test_expect_success '#17.1: setup' ' + 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 <<EOF && +setup: git_dir: . +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/17/.git +setup: prefix: (null) +EOF + test_repo 17/.git +' + +test_expect_success '#17.1: in .git/wt' ' + cat >17/.git/wt/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/17/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/17/.git/wt +setup: prefix: (null) +EOF + test_repo 17/.git/wt +' + +test_expect_success '#17.1: in .git/wt/sub' ' + cat >17/.git/wt/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/17/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/17/.git/wt/sub +setup: prefix: (null) +EOF + test_repo 17/.git/wt/sub +' + +# +# case #17.2 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is set +# - GIT_DIR is not set +# - core.worktree is not set +# - .git is a directory +# - core.bare is set +# +# Output: +# +# GIT_WORK_TREE is ignored -> #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 <<EOF && +setup: git_dir: . +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/17/.git +setup: prefix: (null) +EOF + test_repo 17/.git +' + +test_expect_success '#17.2: in .git/wt' ' + cat >17/.git/wt/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/17/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/17/.git/wt +setup: prefix: (null) +EOF + test_repo 17/.git/wt +' + +test_expect_success '#17.2: in .git/wt/sub' ' + cat >17/.git/wt/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/17/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/17/.git/wt/sub +setup: prefix: (null) +EOF + test_repo 17/.git/wt/sub +' + +test_expect_success '#17.2: at root' ' + cat >17/expected <<EOF && +setup: git_dir: .git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/17 +setup: prefix: (null) +EOF + test_repo 17 +' + +test_expect_success '#17.2: in subdir' ' + cat >17/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/17/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/17/sub +setup: prefix: (null) +EOF + test_repo 17/sub +' + +# +# case #18 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is not set +# - GIT_DIR is set +# - core.worktree is not set +# - .git is a directory +# - core.bare is set +# +# Output: +# +# - no worktree (rule #8) +# - cwd is unchanged +# - prefix is NULL +# - git_dir is set to $GIT_DIR +# - cwd can't be outside worktree + +test_expect_success '#18: setup' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 18 18/sub && + cd 18 && + git init && + mkdir .git/wt .git/wt/sub && + git config core.bare true && + cd .. +' + +test_expect_success '#18: (rel) at root' ' + cat >18/expected <<EOF && +setup: git_dir: .git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/18 +setup: prefix: (null) +EOF + test_repo 18 .git +' + +test_expect_success '#18: at root' ' + cat >18/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/18/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/18 +setup: prefix: (null) +EOF + test_repo 18 "$TRASH_DIRECTORY/18/.git" +' + +test_expect_success '#18: (rel) in subdir' ' + cat >18/sub/expected <<EOF && +setup: git_dir: ../.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/18/sub +setup: prefix: (null) +EOF + test_repo 18/sub ../.git +' + +test_expect_success '#18: in subdir' ' + cat >18/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/18/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/18/sub +setup: prefix: (null) +EOF + test_repo 18/sub "$TRASH_DIRECTORY/18/.git" +' + +# +# case #19 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is set +# - GIT_DIR is set +# - .git is a directory +# - core.worktree is not set +# - core.bare is set +# +# Output: +# +# bare repo is overridden by GIT_WORK_TREE -> #3 + +test_expect_success '#19: setup' ' + 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 <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/19 +setup: cwd: $TRASH_DIRECTORY/19 +setup: prefix: (null) +EOF + test_repo 19 .git "$TRASH_DIRECTORY/19" +' + +test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' ' + cat >19/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/19 +setup: cwd: $TRASH_DIRECTORY/19 +setup: prefix: (null) +EOF + test_repo 19 .git . +' + +test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=root at root' ' + cat >19/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY/19 +setup: cwd: $TRASH_DIRECTORY/19 +setup: prefix: (null) +EOF + test_repo 19 "$TRASH_DIRECTORY/19/.git" "$TRASH_DIRECTORY/19" +' + +test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=root(rel) at root' ' + cat >19/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY/19 +setup: cwd: $TRASH_DIRECTORY/19 +setup: prefix: (null) +EOF + test_repo 19 "$TRASH_DIRECTORY/19/.git" . +' + +test_expect_success '#19: GIT_DIR(rel), GIT_WORKTREE=root in subdir' ' + cat >19/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY/19 +setup: cwd: $TRASH_DIRECTORY/19 +setup: prefix: sub/sub/ +EOF + test_repo 19/sub/sub ../../.git "$TRASH_DIRECTORY/19" +' + +test_expect_success '#19: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' ' + cat >19/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY/19 +setup: cwd: $TRASH_DIRECTORY/19 +setup: prefix: sub/sub/ +EOF + test_repo 19/sub/sub ../../.git ../.. +' + +test_expect_success '#19: GIT_DIR, GIT_WORKTREE=root in subdir' ' + cat >19/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY/19 +setup: cwd: $TRASH_DIRECTORY/19 +setup: prefix: sub/ +EOF + test_repo 19/sub "$TRASH_DIRECTORY/19/.git" "$TRASH_DIRECTORY/19" +' + +test_expect_success '#19: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' ' + cat >19/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY/19 +setup: cwd: $TRASH_DIRECTORY/19 +setup: prefix: sub/sub/ +EOF + test_repo 19/sub/sub "$TRASH_DIRECTORY/19/.git" ../.. +' + +test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=wt at root' ' + cat >19/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/19/wt +setup: cwd: $TRASH_DIRECTORY/19 +setup: prefix: (null) +EOF + test_repo 19 .git "$TRASH_DIRECTORY/19/wt" +' + +test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' ' + cat >19/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/19/wt +setup: cwd: $TRASH_DIRECTORY/19 +setup: prefix: (null) +EOF + test_repo 19 .git wt +' + +test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' ' + cat >19/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY/19/wt +setup: cwd: $TRASH_DIRECTORY/19 +setup: prefix: (null) +EOF + test_repo 19 "$TRASH_DIRECTORY/19/.git" wt +' + +test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=wt at root' ' + cat >19/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY/19/wt +setup: cwd: $TRASH_DIRECTORY/19 +setup: prefix: (null) +EOF + test_repo 19 "$TRASH_DIRECTORY/19/.git" "$TRASH_DIRECTORY/19/wt" +' + +test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' ' + cat >19/sub/sub/expected <<EOF && +setup: git_dir: ../../.git +setup: worktree: $TRASH_DIRECTORY/19/wt +setup: cwd: $TRASH_DIRECTORY/19/sub/sub +setup: prefix: (null) +EOF + test_repo 19/sub/sub ../../.git "$TRASH_DIRECTORY/19/wt" +' + +test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' ' + cat >19/sub/sub/expected <<EOF && +setup: git_dir: ../../.git +setup: worktree: $TRASH_DIRECTORY/19/wt +setup: cwd: $TRASH_DIRECTORY/19/sub/sub +setup: prefix: (null) +EOF + test_repo 19/sub/sub ../../.git ../../wt +' + +test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' ' + cat >19/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY/19/wt +setup: cwd: $TRASH_DIRECTORY/19/sub/sub +setup: prefix: (null) +EOF + test_repo 19/sub/sub "$TRASH_DIRECTORY/19/.git" ../../wt +' + +test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=wt in subdir' ' + cat >19/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY/19/wt +setup: cwd: $TRASH_DIRECTORY/19/sub/sub +setup: prefix: (null) +EOF + test_repo 19/sub/sub "$TRASH_DIRECTORY/19/.git" "$TRASH_DIRECTORY/19/wt" +' + +test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=.. at root' ' + cat >19/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 19/ +EOF + test_repo 19 .git "$TRASH_DIRECTORY" +' + +test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' ' + cat >19/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 19/ +EOF + test_repo 19 .git .. +' + +test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=..(rel) at root' ' + cat >19/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 19/ +EOF + test_repo 19 "$TRASH_DIRECTORY/19/.git" .. +' + +test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=.. at root' ' + cat >19/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 19/ +EOF + test_repo 19 "$TRASH_DIRECTORY/19/.git" "$TRASH_DIRECTORY" +' + +test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' ' + cat >19/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 19/sub/sub/ +EOF + test_repo 19/sub/sub ../../.git "$TRASH_DIRECTORY" +' + +test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' ' + cat >19/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 19/sub/sub/ +EOF + test_repo 19/sub/sub ../../.git ../../.. +' + +test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' ' + cat >19/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 19/sub/sub/ +EOF + test_repo 19/sub/sub "$TRASH_DIRECTORY/19/.git" ../../../ +' + +test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=.. in subdir' ' + cat >19/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/19/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 19/sub/sub/ +EOF + test_repo 19/sub/sub "$TRASH_DIRECTORY/19/.git" "$TRASH_DIRECTORY" +' + +# +# case #20.1 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is not set +# - GIT_DIR is not set +# - core.worktree is set +# - .git is a directory +# - cwd is inside .git +# +# Output: +# +# core.worktree is ignored -> #16.1 + +test_expect_success '#20.1: setup' ' + 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 <<EOF && +setup: git_dir: . +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/20/.git +setup: prefix: (null) +EOF + test_repo 20/.git +' + +test_expect_success '#20.1: in .git/wt' ' + cat >20/.git/wt/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/20/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/20/.git/wt +setup: prefix: (null) +EOF + test_repo 20/.git/wt +' + +test_expect_success '#20.1: in .git/wt/sub' ' + cat >20/.git/wt/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/20/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/20/.git/wt/sub +setup: prefix: (null) +EOF + test_repo 20/.git/wt/sub +' + +# +# case #20.2 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is not set +# - GIT_DIR is not set +# - core.worktree is set +# - .git is a directory +# - core.bare is set +# +# Output: +# +# core.worktree is ignored -> #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 <<EOF && +setup: git_dir: . +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/20/.git +setup: prefix: (null) +EOF + test_repo 20/.git +' + +test_expect_success '#20.2: in .git/wt' ' + cat >20/.git/wt/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/20/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/20/.git/wt +setup: prefix: (null) +EOF + test_repo 20/.git/wt +' + +test_expect_success '#20.2: in .git/wt/sub' ' + cat >20/.git/wt/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/20/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/20/.git/wt/sub +setup: prefix: (null) +EOF + test_repo 20/.git/wt/sub +' + +test_expect_success '#20.2: at root' ' + cat >20/expected <<EOF && +setup: git_dir: .git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/20 +setup: prefix: (null) +EOF + test_repo 20 +' + +test_expect_success '#20.2: in subdir' ' + cat >20/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/20/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/20/sub +setup: prefix: (null) +EOF + test_repo 20/sub +' + +# +# case #21.1 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is set +# - GIT_DIR is not set +# - core.worktree is set +# - .git is a directory +# - cwd is inside .git +# +# Output: +# +# GIT_WORK_TREE/core.worktree are ignored -> #20.1 + +test_expect_success '#21.1: setup' ' + 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 <<EOF && +setup: git_dir: . +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/21/.git +setup: prefix: (null) +EOF + test_repo 21/.git +' + +test_expect_success '#21.1: in .git/wt' ' + cat >21/.git/wt/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/21/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/21/.git/wt +setup: prefix: (null) +EOF + test_repo 21/.git/wt +' + +test_expect_success '#21.1: in .git/wt/sub' ' + cat >21/.git/wt/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/21/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/21/.git/wt/sub +setup: prefix: (null) +EOF + test_repo 21/.git/wt/sub +' + +# +# case #21.2 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is set +# - GIT_DIR is not set +# - core.worktree is set +# - .git is a directory +# - core.bare is set +# +# Output: +# +# GIT_WORK_TREE/core.worktree are ignored -> #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 <<EOF && +setup: git_dir: . +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/21/.git +setup: prefix: (null) +EOF + test_repo 21/.git +' + +test_expect_success '#21.2: in .git/wt' ' + cat >21/.git/wt/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/21/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/21/.git/wt +setup: prefix: (null) +EOF + test_repo 21/.git/wt +' + +test_expect_success '#21.2: in .git/wt/sub' ' + cat >21/.git/wt/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/21/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/21/.git/wt/sub +setup: prefix: (null) +EOF + test_repo 21/.git/wt/sub +' + +test_expect_success '#21.2: at root' ' + cat >21/expected <<EOF && +setup: git_dir: .git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/21 +setup: prefix: (null) +EOF + test_repo 21 +' + +test_expect_success '#21.2: in subdir' ' + cat >21/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/21/.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/21/sub +setup: prefix: (null) +EOF + test_repo 21/sub +' + +# +# case #22.1 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is not set +# - GIT_DIR is set +# - core.worktree is set +# - .git is a directory +# - cwd is inside .git +# +# Output: +# +# bare attribute is ignored +# +# - worktree is at core.worktree +# - cwd is at worktree root +# - prefix is calculated +# - git_dir is at $GIT_DIR +# - cwd can be outside worktree + +test_expect_success '#22.1: setup' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 22 && + cd 22 && + git init && + mkdir .git/sub .git/wt .git/wt/sub && + cd .. +' + +test_expect_success '#22.1: GIT_DIR(rel), core.worktree=. at .git' ' + cat >22/.git/expected <<EOF && +setup: git_dir: . +setup: worktree: $TRASH_DIRECTORY/22/.git +setup: cwd: $TRASH_DIRECTORY/22/.git +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22/.git" && + test_repo 22/.git . +' + +test_expect_success '#22.1: GIT_DIR(rel), core.worktree=.(rel) at .git' ' + cat >22/.git/expected <<EOF && +setup: git_dir: . +setup: worktree: $TRASH_DIRECTORY/22/.git +setup: cwd: $TRASH_DIRECTORY/22/.git +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree . && + test_repo 22/.git . +' + +test_expect_success '#22.1: GIT_DIR, core.worktree=. at .git' ' + cat >22/.git/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22/.git +setup: cwd: $TRASH_DIRECTORY/22/.git +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22/.git" && + test_repo 22/.git "$TRASH_DIRECTORY/22/.git" +' + +test_expect_success '#22.1: GIT_DIR, core.worktree=.(rel) at root' ' + cat >22/.git/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22/.git +setup: cwd: $TRASH_DIRECTORY/22/.git +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree . && + test_repo 22/.git "$TRASH_DIRECTORY/22/.git" +' + +test_expect_success '#22.1: GIT_DIR(rel), core.worktree=. in .git/sub' ' + cat >22/.git/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22/.git +setup: cwd: $TRASH_DIRECTORY/22/.git +setup: prefix: sub/ +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22/.git" && + test_repo 22/.git/sub .. +' + +test_expect_success '#22.1: GIT_DIR(rel), core.worktree=.(rel) in .git/sub' ' + cat >22/.git/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22/.git +setup: cwd: $TRASH_DIRECTORY/22/.git +setup: prefix: sub/ +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree . && + test_repo 22/.git/sub/ .. +' + +test_expect_success '#22.1: GIT_DIR, core.worktree=. in .git/sub' ' + cat >22/.git/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22/.git +setup: cwd: $TRASH_DIRECTORY/22/.git +setup: prefix: sub/ +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22/.git" && + test_repo 22/.git/sub "$TRASH_DIRECTORY/22/.git" +' + +test_expect_success '#22.1: GIT_DIR, core.worktree=.(rel) in .git/sub' ' + cat >22/.git/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22/.git +setup: cwd: $TRASH_DIRECTORY/22/.git +setup: prefix: sub/ +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree . && + test_repo 22/.git/sub "$TRASH_DIRECTORY/22/.git" +' + +test_expect_success '#22.1: GIT_DIR(rel), core.worktree=wt at .git' ' + cat >22/.git/expected <<EOF && +setup: git_dir: . +setup: worktree: $TRASH_DIRECTORY/22/.git/wt +setup: cwd: $TRASH_DIRECTORY/22/.git +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22/.git/wt" && + test_repo 22/.git . +' + +test_expect_success '#22.1: GIT_DIR(rel), core.worktree=wt(rel) at .git' ' + cat >22/.git/expected <<EOF && +setup: git_dir: . +setup: worktree: $TRASH_DIRECTORY/22/.git/wt +setup: cwd: $TRASH_DIRECTORY/22/.git +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree wt && + test_repo 22/.git . +' + +test_expect_success '#22.1: GIT_DIR, core.worktree=wt(rel) at .git' ' + cat >22/.git/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22/.git/wt +setup: cwd: $TRASH_DIRECTORY/22/.git +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree wt && + test_repo 22/.git "$TRASH_DIRECTORY/22/.git" +' + +test_expect_success '#22.1: GIT_DIR, core.worktree=wt at .git' ' + cat >22/.git/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22/.git/wt +setup: cwd: $TRASH_DIRECTORY/22/.git +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22/.git/wt" && + test_repo 22/.git "$TRASH_DIRECTORY/22/.git" +' + +test_expect_success '#22.1: GIT_DIR(rel), core.worktree=wt in .git/sub' ' + cat >22/.git/sub/expected <<EOF && +setup: git_dir: .. +setup: worktree: $TRASH_DIRECTORY/22/.git/wt +setup: cwd: $TRASH_DIRECTORY/22/.git/sub +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22/.git/wt" && + test_repo 22/.git/sub .. +' + +test_expect_success '#22.1: GIT_DIR(rel), core.worktree=wt(rel) in .git/sub' ' + cat >22/.git/sub/expected <<EOF && +setup: git_dir: .. +setup: worktree: $TRASH_DIRECTORY/22/.git/wt +setup: cwd: $TRASH_DIRECTORY/22/.git/sub +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree wt && + test_repo 22/.git/sub .. +' + +test_expect_success '#22.1: GIT_DIR, core.worktree=wt(rel) in .git/sub' ' + cat >22/.git/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22/.git/wt +setup: cwd: $TRASH_DIRECTORY/22/.git/sub +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree wt && + test_repo 22/.git/sub "$TRASH_DIRECTORY/22/.git" +' + +test_expect_success '#22.1: GIT_DIR, core.worktree=wt in .git/sub' ' + cat >22/.git/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22/.git/wt +setup: cwd: $TRASH_DIRECTORY/22/.git/sub +setup: prefix: (null) +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22/.git/wt" && + test_repo 22/.git/sub "$TRASH_DIRECTORY/22/.git" +' + +test_expect_success '#22.1: GIT_DIR(rel), core.worktree=.. at .git' ' + cat >22/.git/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22 +setup: cwd: $TRASH_DIRECTORY/22 +setup: prefix: .git/ +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22" && + test_repo 22/.git . +' + +test_expect_success '#22.1: GIT_DIR(rel), core.worktree=..(rel) at .git' ' + cat >22/.git/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22 +setup: cwd: $TRASH_DIRECTORY/22 +setup: prefix: .git/ +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree .. && + test_repo 22/.git . +' + +test_expect_success '#22.1: GIT_DIR, core.worktree=..(rel) at .git' ' + cat >22/.git/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22 +setup: cwd: $TRASH_DIRECTORY/22 +setup: prefix: .git/ +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree .. && + test_repo 22/.git "$TRASH_DIRECTORY/22/.git" +' + +test_expect_success '#22.1: GIT_DIR, core.worktree=.. at .git' ' + cat >22/.git/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22 +setup: cwd: $TRASH_DIRECTORY/22 +setup: prefix: .git/ +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22" && + test_repo 22/.git "$TRASH_DIRECTORY/22/.git" +' + +test_expect_success '#22.1: GIT_DIR(rel), core.worktree=.. in .git/sub' ' + cat >22/.git/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22 +setup: cwd: $TRASH_DIRECTORY/22 +setup: prefix: .git/sub/ +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22" && + test_repo 22/.git/sub .. +' + +test_expect_success '#22.1: GIT_DIR(rel), core.worktree=..(rel) in .git/sub' ' + cat >22/.git/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22 +setup: cwd: $TRASH_DIRECTORY/22 +setup: prefix: .git/sub/ +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree .. && + test_repo 22/.git/sub .. +' + +test_expect_success '#22.1: GIT_DIR, core.worktree=..(rel) in .git/sub' ' + cat >22/.git/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22 +setup: cwd: $TRASH_DIRECTORY/22 +setup: prefix: .git/sub/ +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree .. && + test_repo 22/.git/sub "$TRASH_DIRECTORY/22/.git" +' + +test_expect_success '#22.1: GIT_DIR, core.worktree=.. in .git/sub' ' + cat >22/.git/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/22/.git +setup: worktree: $TRASH_DIRECTORY/22 +setup: cwd: $TRASH_DIRECTORY/22 +setup: prefix: .git/sub/ +EOF + git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22" && + test_repo 22/.git/sub "$TRASH_DIRECTORY/22/.git" +' + +# +# case #22.2 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is not set +# - GIT_DIR is set +# - core.worktree is set +# - .git is a directory +# - core.bare is set +# +# Output: +# +# core.worktree and core.bare conflict, won't fly. + +test_expect_success '#22.2: setup' ' + git config --file="$TRASH_DIRECTORY/22/.git/config" core.bare true +' + +test_expect_success '#22.2: at .git' ' + ( + cd 22/.git && + GIT_DIR=. && + export GIT_DIR && + test_must_fail git symbolic-ref HEAD 2>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' ' + 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 <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/23 +setup: cwd: $TRASH_DIRECTORY/23 +setup: prefix: (null) +EOF + test_repo 23 .git "$TRASH_DIRECTORY/23" +' + +test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' ' + cat >23/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/23 +setup: cwd: $TRASH_DIRECTORY/23 +setup: prefix: (null) +EOF + test_repo 23 .git . +' + +test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=root at root' ' + cat >23/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY/23 +setup: cwd: $TRASH_DIRECTORY/23 +setup: prefix: (null) +EOF + test_repo 23 "$TRASH_DIRECTORY/23/.git" "$TRASH_DIRECTORY/23" +' + +test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=root(rel) at root' ' + cat >23/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY/23 +setup: cwd: $TRASH_DIRECTORY/23 +setup: prefix: (null) +EOF + test_repo 23 "$TRASH_DIRECTORY/23/.git" . +' + +test_expect_success '#23: GIT_DIR(rel), GIT_WORKTREE=root in subdir' ' + cat >23/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY/23 +setup: cwd: $TRASH_DIRECTORY/23 +setup: prefix: sub/sub/ +EOF + test_repo 23/sub/sub ../../.git "$TRASH_DIRECTORY/23" +' + +test_expect_success '#23: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' ' + cat >23/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY/23 +setup: cwd: $TRASH_DIRECTORY/23 +setup: prefix: sub/sub/ +EOF + test_repo 23/sub/sub ../../.git ../.. +' + +test_expect_success '#23: GIT_DIR, GIT_WORKTREE=root in subdir' ' + cat >23/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY/23 +setup: cwd: $TRASH_DIRECTORY/23 +setup: prefix: sub/ +EOF + test_repo 23/sub "$TRASH_DIRECTORY/23/.git" "$TRASH_DIRECTORY/23" +' + +test_expect_success '#23: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' ' + cat >23/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY/23 +setup: cwd: $TRASH_DIRECTORY/23 +setup: prefix: sub/sub/ +EOF + test_repo 23/sub/sub "$TRASH_DIRECTORY/23/.git" ../.. +' + +test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=wt at root' ' + cat >23/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/23/wt +setup: cwd: $TRASH_DIRECTORY/23 +setup: prefix: (null) +EOF + test_repo 23 .git "$TRASH_DIRECTORY/23/wt" +' + +test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' ' + cat >23/expected <<EOF && +setup: git_dir: .git +setup: worktree: $TRASH_DIRECTORY/23/wt +setup: cwd: $TRASH_DIRECTORY/23 +setup: prefix: (null) +EOF + test_repo 23 .git wt +' + +test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' ' + cat >23/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY/23/wt +setup: cwd: $TRASH_DIRECTORY/23 +setup: prefix: (null) +EOF + test_repo 23 "$TRASH_DIRECTORY/23/.git" wt +' + +test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=wt at root' ' + cat >23/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY/23/wt +setup: cwd: $TRASH_DIRECTORY/23 +setup: prefix: (null) +EOF + test_repo 23 "$TRASH_DIRECTORY/23/.git" "$TRASH_DIRECTORY/23/wt" +' + +test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' ' + cat >23/sub/sub/expected <<EOF && +setup: git_dir: ../../.git +setup: worktree: $TRASH_DIRECTORY/23/wt +setup: cwd: $TRASH_DIRECTORY/23/sub/sub +setup: prefix: (null) +EOF + test_repo 23/sub/sub ../../.git "$TRASH_DIRECTORY/23/wt" +' + +test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' ' + cat >23/sub/sub/expected <<EOF && +setup: git_dir: ../../.git +setup: worktree: $TRASH_DIRECTORY/23/wt +setup: cwd: $TRASH_DIRECTORY/23/sub/sub +setup: prefix: (null) +EOF + test_repo 23/sub/sub ../../.git ../../wt +' + +test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' ' + cat >23/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY/23/wt +setup: cwd: $TRASH_DIRECTORY/23/sub/sub +setup: prefix: (null) +EOF + test_repo 23/sub/sub "$TRASH_DIRECTORY/23/.git" ../../wt +' + +test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=wt in subdir' ' + cat >23/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY/23/wt +setup: cwd: $TRASH_DIRECTORY/23/sub/sub +setup: prefix: (null) +EOF + test_repo 23/sub/sub "$TRASH_DIRECTORY/23/.git" "$TRASH_DIRECTORY/23/wt" +' + +test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=.. at root' ' + cat >23/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 23/ +EOF + test_repo 23 .git "$TRASH_DIRECTORY" +' + +test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' ' + cat >23/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 23/ +EOF + test_repo 23 .git .. +' + +test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=..(rel) at root' ' + cat >23/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 23/ +EOF + test_repo 23 "$TRASH_DIRECTORY/23/.git" .. +' + +test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=.. at root' ' + cat >23/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 23/ +EOF + test_repo 23 "$TRASH_DIRECTORY/23/.git" "$TRASH_DIRECTORY" +' + +test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' ' + cat >23/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 23/sub/sub/ +EOF + test_repo 23/sub/sub ../../.git "$TRASH_DIRECTORY" +' + +test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' ' + cat >23/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 23/sub/sub/ +EOF + test_repo 23/sub/sub ../../.git ../../.. +' + +test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' ' + cat >23/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 23/sub/sub/ +EOF + test_repo 23/sub/sub "$TRASH_DIRECTORY/23/.git" ../../../ +' + +test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=.. in subdir' ' + cat >23/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/23/.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 23/sub/sub/ +EOF + test_repo 23/sub/sub "$TRASH_DIRECTORY/23/.git" "$TRASH_DIRECTORY" +' + +# +# case #24 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is not set +# - GIT_DIR is not set +# - core.worktree is not set +# - .git is a file +# - core.bare is set +# +# Output: +# +# #16.2 except git_dir is set according to .git file + +test_expect_success '#24: setup' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 24 24/sub && + cd 24 && + git init && + git config core.bare true && + mv .git ../24.git && + echo gitdir: ../24.git >.git && + cd .. +' + +test_expect_success '#24: at root' ' + cat >24/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/24.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/24 +setup: prefix: (null) +EOF + test_repo 24 +' + +test_expect_success '#24: in subdir' ' + cat >24/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/24.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/24/sub +setup: prefix: (null) +EOF + test_repo 24/sub +' + +# +# case #25 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is set +# - GIT_DIR is not set +# - core.worktree is not set +# - .git is a file +# - core.bare is set +# +# Output: +# +# #17.2 except git_dir is set according to .git file + +test_expect_success '#25: setup' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 25 25/sub && + cd 25 && + git init && + git config core.bare true && + GIT_WORK_TREE=non-existent && + export GIT_WORK_TREE && + mv .git ../25.git && + echo gitdir: ../25.git >.git && + cd .. +' + +test_expect_success '#25: at root' ' + cat >25/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/25.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/25 +setup: prefix: (null) +EOF + test_repo 25 +' + +test_expect_success '#25: in subdir' ' + cat >25/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/25.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/25/sub +setup: prefix: (null) +EOF + test_repo 25/sub +' + +# +# case #26 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is not set +# - GIT_DIR is set +# - core.worktree is not set +# - .git is a file +# - core.bare is set +# +# Output: +# +# #18 except git_dir is set according to .git file + +test_expect_success '#26: setup' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 26 26/sub && + cd 26 && + git init && + git config core.bare true && + mv .git ../26.git && + echo gitdir: ../26.git >.git && + cd .. +' + +test_expect_success '#26: (rel) at root' ' + cat >26/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/26.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/26 +setup: prefix: (null) +EOF + test_repo 26 .git +' + +test_expect_success '#26: at root' ' + cat >26/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/26.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/26 +setup: prefix: (null) +EOF + test_repo 26 "$TRASH_DIRECTORY/26/.git" +' + +test_expect_success '#26: (rel) in subdir' ' + cat >26/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/26.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/26/sub +setup: prefix: (null) +EOF + test_repo 26/sub ../.git +' + +test_expect_success '#26: in subdir' ' + cat >26/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/26.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/26/sub +setup: prefix: (null) +EOF + test_repo 26/sub "$TRASH_DIRECTORY/26/.git" +' + +# +# case #27 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is set +# - GIT_DIR is set +# - .git is a file +# - core.worktree is not set +# - core.bare is set +# +# Output: +# +# #19 except git_dir is set according to .git file + +test_expect_success '#27: setup' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 27 27/sub 27/sub/sub 27.wt 27.wt/sub 27/wt 27/wt/sub && + cd 27 && + git init && + git config core.bare true && + mv .git ../27.git && + echo gitdir: ../27.git >.git && + cd .. +' + +test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' + cat >27/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY/27 +setup: cwd: $TRASH_DIRECTORY/27 +setup: prefix: (null) +EOF + test_repo 27 .git "$TRASH_DIRECTORY/27" +' + +test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' ' + cat >27/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY/27 +setup: cwd: $TRASH_DIRECTORY/27 +setup: prefix: (null) +EOF + test_repo 27 .git . +' + +test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=root at root' ' + cat >27/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY/27 +setup: cwd: $TRASH_DIRECTORY/27 +setup: prefix: (null) +EOF + test_repo 27 "$TRASH_DIRECTORY/27/.git" "$TRASH_DIRECTORY/27" +' + +test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=root(rel) at root' ' + cat >27/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY/27 +setup: cwd: $TRASH_DIRECTORY/27 +setup: prefix: (null) +EOF + test_repo 27 "$TRASH_DIRECTORY/27/.git" . +' + +test_expect_success '#27: GIT_DIR(rel), GIT_WORKTREE=root in subdir' ' + cat >27/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY/27 +setup: cwd: $TRASH_DIRECTORY/27 +setup: prefix: sub/sub/ +EOF + test_repo 27/sub/sub ../../.git "$TRASH_DIRECTORY/27" +' + +test_expect_success '#27: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' ' + cat >27/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY/27 +setup: cwd: $TRASH_DIRECTORY/27 +setup: prefix: sub/sub/ +EOF + test_repo 27/sub/sub ../../.git ../.. +' + +test_expect_success '#27: GIT_DIR, GIT_WORKTREE=root in subdir' ' + cat >27/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY/27 +setup: cwd: $TRASH_DIRECTORY/27 +setup: prefix: sub/ +EOF + test_repo 27/sub "$TRASH_DIRECTORY/27/.git" "$TRASH_DIRECTORY/27" +' + +test_expect_success '#27: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' ' + cat >27/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY/27 +setup: cwd: $TRASH_DIRECTORY/27 +setup: prefix: sub/sub/ +EOF + test_repo 27/sub/sub "$TRASH_DIRECTORY/27/.git" ../.. +' + +test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=wt at root' ' + cat >27/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY/27/wt +setup: cwd: $TRASH_DIRECTORY/27 +setup: prefix: (null) +EOF + test_repo 27 .git "$TRASH_DIRECTORY/27/wt" +' + +test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' ' + cat >27/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY/27/wt +setup: cwd: $TRASH_DIRECTORY/27 +setup: prefix: (null) +EOF + test_repo 27 .git wt +' + +test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' ' + cat >27/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY/27/wt +setup: cwd: $TRASH_DIRECTORY/27 +setup: prefix: (null) +EOF + test_repo 27 "$TRASH_DIRECTORY/27/.git" wt +' + +test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=wt at root' ' + cat >27/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY/27/wt +setup: cwd: $TRASH_DIRECTORY/27 +setup: prefix: (null) +EOF + test_repo 27 "$TRASH_DIRECTORY/27/.git" "$TRASH_DIRECTORY/27/wt" +' + +test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' ' + cat >27/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY/27/wt +setup: cwd: $TRASH_DIRECTORY/27/sub/sub +setup: prefix: (null) +EOF + test_repo 27/sub/sub ../../.git "$TRASH_DIRECTORY/27/wt" +' + +test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' ' + cat >27/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY/27/wt +setup: cwd: $TRASH_DIRECTORY/27/sub/sub +setup: prefix: (null) +EOF + test_repo 27/sub/sub ../../.git ../../wt +' + +test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' ' + cat >27/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY/27/wt +setup: cwd: $TRASH_DIRECTORY/27/sub/sub +setup: prefix: (null) +EOF + test_repo 27/sub/sub "$TRASH_DIRECTORY/27/.git" ../../wt +' + +test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=wt in subdir' ' + cat >27/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY/27/wt +setup: cwd: $TRASH_DIRECTORY/27/sub/sub +setup: prefix: (null) +EOF + test_repo 27/sub/sub "$TRASH_DIRECTORY/27/.git" "$TRASH_DIRECTORY/27/wt" +' + +test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=.. at root' ' + cat >27/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 27/ +EOF + test_repo 27 .git "$TRASH_DIRECTORY" +' + +test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' ' + cat >27/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 27/ +EOF + test_repo 27 .git .. +' + +test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=..(rel) at root' ' + cat >27/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 27/ +EOF + test_repo 27 "$TRASH_DIRECTORY/27/.git" .. +' + +test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=.. at root' ' + cat >27/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 27/ +EOF + test_repo 27 "$TRASH_DIRECTORY/27/.git" "$TRASH_DIRECTORY" +' + +test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' ' + cat >27/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 27/sub/sub/ +EOF + test_repo 27/sub/sub ../../.git "$TRASH_DIRECTORY" +' + +test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' ' + cat >27/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 27/sub/sub/ +EOF + test_repo 27/sub/sub ../../.git ../../.. +' + +test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' ' + cat >27/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 27/sub/sub/ +EOF + test_repo 27/sub/sub "$TRASH_DIRECTORY/27/.git" ../../../ +' + +test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=.. in subdir' ' + cat >27/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/27.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 27/sub/sub/ +EOF + test_repo 27/sub/sub "$TRASH_DIRECTORY/27/.git" "$TRASH_DIRECTORY" +' + +# +# case #28 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is not set +# - GIT_DIR is not set +# - core.worktree is set +# - .git is a file +# - core.bare is set +# +# Output: +# +# core.worktree is ignored -> #24 + +test_expect_success '#28: setup' ' + 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 <<EOF && +setup: git_dir: $TRASH_DIRECTORY/28.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/28 +setup: prefix: (null) +EOF + test_repo 28 +' + +test_expect_success '#28: in subdir' ' + cat >28/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/28.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/28/sub +setup: prefix: (null) +EOF + test_repo 28/sub +' + +# +# case #29 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is set +# - GIT_DIR is not set +# - core.worktree is set +# - .git is a file +# - core.bare is set +# +# Output: +# +# GIT_WORK_TREE/core.worktree are ignored -> #28 + +test_expect_success '#29: setup' ' + 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 <<EOF && +setup: git_dir: $TRASH_DIRECTORY/29.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/29 +setup: prefix: (null) +EOF + test_repo 29 +' + +test_expect_success '#29: in subdir' ' + cat >29/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/29.git +setup: worktree: (null) +setup: cwd: $TRASH_DIRECTORY/29/sub +setup: prefix: (null) +EOF + test_repo 29/sub +' + +# +# case #30 +# +############################################################ +# +# Input: +# +# - GIT_WORK_TREE is not set +# - GIT_DIR is set +# - core.worktree is set +# - .git is a file +# - core.bare is set +# +# Output: +# +# core.worktree and core.bare conflict, won't fly. + +test_expect_success '#30: setup' ' + unset GIT_DIR GIT_WORK_TREE && + mkdir 30 && + cd 30 && + git init && + git config core.bare true && + git config core.worktree non-existent && + mv .git ../30.git && + echo gitdir: ../30.git >.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' ' + 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 <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY/31 +setup: cwd: $TRASH_DIRECTORY/31 +setup: prefix: (null) +EOF + test_repo 31 .git "$TRASH_DIRECTORY/31" +' + +test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' ' + cat >31/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY/31 +setup: cwd: $TRASH_DIRECTORY/31 +setup: prefix: (null) +EOF + test_repo 31 .git . +' + +test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=root at root' ' + cat >31/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY/31 +setup: cwd: $TRASH_DIRECTORY/31 +setup: prefix: (null) +EOF + test_repo 31 "$TRASH_DIRECTORY/31/.git" "$TRASH_DIRECTORY/31" +' + +test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=root(rel) at root' ' + cat >31/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY/31 +setup: cwd: $TRASH_DIRECTORY/31 +setup: prefix: (null) +EOF + test_repo 31 "$TRASH_DIRECTORY/31/.git" . +' + +test_expect_success '#31: GIT_DIR(rel), GIT_WORKTREE=root in subdir' ' + cat >31/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY/31 +setup: cwd: $TRASH_DIRECTORY/31 +setup: prefix: sub/sub/ +EOF + test_repo 31/sub/sub ../../.git "$TRASH_DIRECTORY/31" +' + +test_expect_success '#31: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' ' + cat >31/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY/31 +setup: cwd: $TRASH_DIRECTORY/31 +setup: prefix: sub/sub/ +EOF + test_repo 31/sub/sub ../../.git ../.. +' + +test_expect_success '#31: GIT_DIR, GIT_WORKTREE=root in subdir' ' + cat >31/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY/31 +setup: cwd: $TRASH_DIRECTORY/31 +setup: prefix: sub/ +EOF + test_repo 31/sub "$TRASH_DIRECTORY/31/.git" "$TRASH_DIRECTORY/31" +' + +test_expect_success '#31: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' ' + cat >31/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY/31 +setup: cwd: $TRASH_DIRECTORY/31 +setup: prefix: sub/sub/ +EOF + test_repo 31/sub/sub "$TRASH_DIRECTORY/31/.git" ../.. +' + +test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=wt at root' ' + cat >31/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY/31/wt +setup: cwd: $TRASH_DIRECTORY/31 +setup: prefix: (null) +EOF + test_repo 31 .git "$TRASH_DIRECTORY/31/wt" +' + +test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' ' + cat >31/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY/31/wt +setup: cwd: $TRASH_DIRECTORY/31 +setup: prefix: (null) +EOF + test_repo 31 .git wt +' + +test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' ' + cat >31/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY/31/wt +setup: cwd: $TRASH_DIRECTORY/31 +setup: prefix: (null) +EOF + test_repo 31 "$TRASH_DIRECTORY/31/.git" wt +' + +test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=wt at root' ' + cat >31/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY/31/wt +setup: cwd: $TRASH_DIRECTORY/31 +setup: prefix: (null) +EOF + test_repo 31 "$TRASH_DIRECTORY/31/.git" "$TRASH_DIRECTORY/31/wt" +' + +test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' ' + cat >31/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY/31/wt +setup: cwd: $TRASH_DIRECTORY/31/sub/sub +setup: prefix: (null) +EOF + test_repo 31/sub/sub ../../.git "$TRASH_DIRECTORY/31/wt" +' + +test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' ' + cat >31/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY/31/wt +setup: cwd: $TRASH_DIRECTORY/31/sub/sub +setup: prefix: (null) +EOF + test_repo 31/sub/sub ../../.git ../../wt +' + +test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' ' + cat >31/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY/31/wt +setup: cwd: $TRASH_DIRECTORY/31/sub/sub +setup: prefix: (null) +EOF + test_repo 31/sub/sub "$TRASH_DIRECTORY/31/.git" ../../wt +' + +test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=wt in subdir' ' + cat >31/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY/31/wt +setup: cwd: $TRASH_DIRECTORY/31/sub/sub +setup: prefix: (null) +EOF + test_repo 31/sub/sub "$TRASH_DIRECTORY/31/.git" "$TRASH_DIRECTORY/31/wt" +' + +test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=.. at root' ' + cat >31/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 31/ +EOF + test_repo 31 .git "$TRASH_DIRECTORY" +' + +test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' ' + cat >31/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 31/ +EOF + test_repo 31 .git .. +' + +test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=..(rel) at root' ' + cat >31/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 31/ +EOF + test_repo 31 "$TRASH_DIRECTORY/31/.git" .. +' + +test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=.. at root' ' + cat >31/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 31/ +EOF + test_repo 31 "$TRASH_DIRECTORY/31/.git" "$TRASH_DIRECTORY" +' + +test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' ' + cat >31/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 31/sub/sub/ +EOF + test_repo 31/sub/sub ../../.git "$TRASH_DIRECTORY" +' + +test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' ' + cat >31/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 31/sub/sub/ +EOF + test_repo 31/sub/sub ../../.git ../../.. +' + +test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' ' + cat >31/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 31/sub/sub/ +EOF + test_repo 31/sub/sub "$TRASH_DIRECTORY/31/.git" ../../../ +' + +test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=.. in subdir' ' + cat >31/sub/sub/expected <<EOF && +setup: git_dir: $TRASH_DIRECTORY/31.git +setup: worktree: $TRASH_DIRECTORY +setup: cwd: $TRASH_DIRECTORY +setup: prefix: 31/sub/sub/ +EOF + test_repo 31/sub/sub "$TRASH_DIRECTORY/31/.git" "$TRASH_DIRECTORY" +' + +test_done diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh index d3a3bd267..7d8147bb9 100755 --- a/t/t3404-rebase-interactive.sh +++ b/t/t3404-rebase-interactive.sh @@ -71,8 +71,9 @@ test_expect_success 'setup' ' # "exec" commands are ran with the user shell by default, but this may # be non-POSIX. For example, if SHELL=zsh then ">file" doesn't work # to create a file. Unseting SHELL avoids such non-portable behavior -# in tests. +# in tests. It must be exported for it to take effect where needed. SHELL= +export SHELL test_expect_success 'rebase -i with the exec command' ' git checkout master && diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh index b26cabd57..cd093bd34 100755 --- a/t/t3600-rm.sh +++ b/t/t3600-rm.sh @@ -96,7 +96,7 @@ test_expect_success FUNNYNAMES \ "git rm -f 'space embedded' 'tab embedded' 'newline embedded'" -test_expect_success RO_DIR 'Test that "git rm -f" fails if its rm fails' ' +test_expect_success SANITY 'Test that "git rm -f" fails if its rm fails' ' chmod a-w . && test_must_fail git rm -f baz && chmod 775 . diff --git a/t/t4151-am-abort.sh b/t/t4151-am-abort.sh index b55c41178..c95c4ccc3 100755 --- a/t/t4151-am-abort.sh +++ b/t/t4151-am-abort.sh @@ -62,4 +62,13 @@ do done +test_expect_success 'am --abort will keep the local commits intact' ' + test_must_fail git am 0004-*.patch && + test_commit unrelated && + git rev-parse HEAD >expect && + git am --abort && + git rev-parse HEAD >actual && + test_cmp expect actual +' + test_done diff --git a/t/t5407-post-rewrite-hook.sh b/t/t5407-post-rewrite-hook.sh index 552da65a6..baa670cea 100755 --- a/t/t5407-post-rewrite-hook.sh +++ b/t/t5407-post-rewrite-hook.sh @@ -10,7 +10,11 @@ test_expect_success 'setup' ' test_commit A foo A && test_commit B foo B && test_commit C foo C && - test_commit D foo D + test_commit D foo D && + git checkout A^0 && + test_commit E bar E && + test_commit F foo F && + git checkout master ' mkdir .git/hooks @@ -79,6 +83,18 @@ EOF verify_hook_input ' +test_expect_success 'git rebase --skip the last one' ' + git reset --hard F && + clear_hook_input && + test_must_fail git rebase --onto D A && + git rebase --skip && + echo rebase >expected.args && + cat >expected.data <<EOF && +$(git rev-parse E) $(git rev-parse HEAD) +EOF + verify_hook_input +' + test_expect_success 'git rebase -m' ' git reset --hard D && clear_hook_input && diff --git a/t/t7501-commit.sh b/t/t7501-commit.sh index 8297cb4f1..8980738c7 100755 --- a/t/t7501-commit.sh +++ b/t/t7501-commit.sh @@ -230,6 +230,10 @@ test_expect_success 'amend commit to fix date' ' ' +test_expect_success 'commit complains about bogus date' ' + test_must_fail git commit --amend --date=10.11.2010 +' + test_expect_success 'sign off (1)' ' echo 1 >positive && diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index 5e4831801..3271426f7 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -319,7 +319,7 @@ test_expect_success $PREREQ 'In-Reply-To without --chain-reply-to' ' git send-email \ --from="Example <nobody@example.com>" \ --to=nobody@example.com \ - --no-chain-reply-to \ + --nochain-reply-to \ --in-reply-to="$(cat expect)" \ --smtp-server="$(pwd)/fake.sendmail" \ $patches $patches $patches \ @@ -1135,7 +1135,7 @@ test_expect_success $PREREQ '--8bit-encoding also treats subject' ' # Note that the patches in this test are deliberately out of order; we # want to make sure it works even if the cover-letter is not in the # first mail. -test_expect_success 'refusing to send cover letter template' ' +test_expect_success $PREREQ 'refusing to send cover letter template' ' clean_fake_sendmail && rm -fr outdir && git format-patch --cover-letter -2 -o outdir && @@ -1151,7 +1151,7 @@ test_expect_success 'refusing to send cover letter template' ' test -z "$(ls msgtxt*)" ' -test_expect_success '--force sends cover letter template anyway' ' +test_expect_success $PREREQ '--force sends cover letter template anyway' ' clean_fake_sendmail && rm -fr outdir && git format-patch --cover-letter -2 -o outdir && diff --git a/t/t9142-git-svn-shallow-clone.sh b/t/t9142-git-svn-shallow-clone.sh index 1236accd9..e21ee5f66 100755 --- a/t/t9142-git-svn-shallow-clone.sh +++ b/t/t9142-git-svn-shallow-clone.sh @@ -17,11 +17,10 @@ test_expect_success 'setup test repository' ' > foo && svn_cmd add foo && svn_cmd commit -m "add foo" - ) + ) && + start_httpd ' -start_httpd - test_expect_success 'clone trunk with "-r HEAD"' ' git svn clone -r HEAD "$svnrepo/trunk" g && ( cd g && git rev-parse --symbolic --verify HEAD ) diff --git a/t/t9501-gitweb-standalone-http-status.sh b/t/t9501-gitweb-standalone-http-status.sh index 2487da129..18825aff8 100755 --- a/t/t9501-gitweb-standalone-http-status.sh +++ b/t/t9501-gitweb-standalone-http-status.sh @@ -16,7 +16,7 @@ code and message.' # snapshot settings test_expect_success 'setup' " - test_commit 'SnapshotTests' 'i can has snapshot?' + test_commit 'SnapshotTests' 'i can has snapshot' " diff --git a/t/t9600-cvsimport.sh b/t/t9600-cvsimport.sh index 432b82e3d..4c384ff02 100755 --- a/t/t9600-cvsimport.sh +++ b/t/t9600-cvsimport.sh @@ -89,7 +89,8 @@ EOF test_expect_success PERL 'update git module' ' (cd module-git && - git cvsimport -a -R -z 0 module && + git config cvsimport.trackRevisions true && + git cvsimport -a -z 0 module && git merge origin ) && test_cmp module-cvs/o_fortuna module-git/o_fortuna @@ -117,7 +118,8 @@ test_expect_success PERL 'cvsimport.module config works' ' (cd module-git && git config cvsimport.module module && - git cvsimport -a -R -z0 && + git config cvsimport.trackRevisions true && + git cvsimport -a -z0 && git merge origin ) && test_cmp module-cvs/tick module-git/tick @@ -137,6 +139,7 @@ test_expect_success PERL 'import from a CVS working tree' ' $CVS co -d import-from-wt module && (cd import-from-wt && + git config cvsimport.trackRevisions false && git cvsimport -a -z0 && echo 1 >expect && git log -1 --pretty=format:%s%n >actual && diff --git a/t/test-lib.sh b/t/test-lib.sh index 48fa51600..cb1ca973a 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -260,7 +260,7 @@ test_decode_color () { if (n == 47) return "BWHITE"; } { - while (match($0, /\x1b\[[0-9;]*m/) != 0) { + while (match($0, /\033\[[0-9;]*m/) != 0) { printf "%s<", substr($0, 1, RSTART-1); codes = substr($0, RSTART+2, RLENGTH-3); if (length(codes) == 0) |