1#!/bin/sh 2 3test_description='Tests of cwd/prefix/worktree/gitdir setup in all cases' 4 5. ./test-lib.sh 6 7# 8# A few rules for repo setup: 9# 10# 1. GIT_DIR is relative to user's cwd. --git-dir is equivalent to 11# GIT_DIR. 12# 13# 2. .git file is relative to parent directory. .git file is basically 14# symlink in disguise. The directory where .git file points to will 15# become new git_dir. 16# 17# 3. core.worktree is relative to git_dir. 18# 19# 4. GIT_WORK_TREE is relative to user's cwd. --work-tree is 20# equivalent to GIT_WORK_TREE. 21# 22# 5. GIT_WORK_TREE/core.worktree is only effective if GIT_DIR is set 23# Uneffective worktree settings should be warned. 24# 25# 6. Effective GIT_WORK_TREE overrides core.worktree and core.bare 26# 27# 7. Effective core.worktree conflicts with core.bare 28# 29# 8. If GIT_DIR is set but neither worktree nor bare setting is given, 30# original cwd becomes worktree. 31# 32# 9. If .git discovery is done inside a repo, the repo becomes a bare 33# repo. .git discovery is performed if GIT_DIR is not set. 34# 35# 10. If no worktree is available, cwd remains unchanged, prefix is 36# NULL. 37# 38# 11. When user's cwd is outside worktree, cwd remains unchanged, 39# prefix is NULL. 40# 41 42test_repo() { 43( 44cd"$1"&& 45iftest -n"$2";then GIT_DIR="$2"&&export GIT_DIR;fi&& 46iftest -n"$3";then GIT_WORK_TREE="$3"&&export GIT_WORK_TREE;fi&& 47rm-f trace && 48 GIT_TRACE="`pwd`/trace" git symbolic-ref HEAD >/dev/null && 49grep'^setup: ' trace >result && 50 test_cmp expected result 51) 52} 53 54# Bit 0 = GIT_WORK_TREE 55# Bit 1 = GIT_DIR 56# Bit 2 = core.worktree 57# Bit 3 = .git is a file 58# Bit 4 = bare repo 59# Case# = encoding of the above 5 bits 60 61# 62# Case #0 63# 64############################################################ 65# 66# Input: 67# 68# - GIT_WORK_TREE is not set 69# - GIT_DIR is not set 70# - core.worktree is not set 71# - .git is a directory 72# - core.bare is not set, cwd is outside .git 73# 74# Output: 75# 76# - worktree is .git's parent directory 77# - cwd is at worktree root dir 78# - prefix is calculated 79# - git_dir is set to ".git" 80# - cwd can't be outside worktree 81 82test_expect_success '#0: setup'' 83 unset GIT_DIR GIT_WORK_TREE && 84 mkdir 0 0/sub && 85 cd 0 && git init && cd .. 86' 87 88test_expect_success '#0: at root'' 89 cat >0/expected <<EOF && 90setup: git_dir: .git 91setup: worktree:$TRASH_DIRECTORY/0 92setup: cwd:$TRASH_DIRECTORY/0 93setup: prefix: (null) 94EOF 95 test_repo 0 96' 97 98test_expect_success '#0: in subdir'' 99 cat >0/sub/expected <<EOF && 100setup: git_dir: .git 101setup: worktree:$TRASH_DIRECTORY/0 102setup: cwd:$TRASH_DIRECTORY/0 103setup: prefix: sub/ 104EOF 105 test_repo 0/sub 106' 107 108# 109# case #1 110# 111############################################################ 112# 113# Input: 114# 115# - GIT_WORK_TREE is set 116# - GIT_DIR is not set 117# - core.worktree is not set 118# - .git is a directory 119# - core.bare is not set, cwd is outside .git 120# 121# Output: 122# 123# GIT_WORK_TREE is ignored -> #0 124 125test_expect_success '#1: setup'' 126 unset GIT_DIR GIT_WORK_TREE && 127 mkdir 1 1/sub 1.wt 1.wt/sub 1/wt 1/wt/sub && 128 cd 1 && 129 git init && 130 GIT_WORK_TREE=non-existent && 131 export GIT_WORK_TREE && 132 cd .. 133' 134 135test_expect_failure '#1: at root'' 136 cat >1/expected <<EOF && 137setup: git_dir: .git 138setup: worktree:$TRASH_DIRECTORY/1 139setup: cwd:$TRASH_DIRECTORY/1 140setup: prefix: (null) 141EOF 142 test_repo 1 143' 144 145test_expect_failure '#1: in subdir'' 146 cat >1/sub/expected <<EOF && 147setup: git_dir: .git 148setup: worktree:$TRASH_DIRECTORY/1 149setup: cwd:$TRASH_DIRECTORY/1 150setup: prefix: sub/ 151EOF 152 test_repo 1/sub 153' 154 155test_done