t1501-worktree.sh 3.3 KB
Newer Older
M
Matthias Lederhofer 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
#!/bin/sh

test_description='test separate work tree'
. ./test-lib.sh

test_rev_parse() {
	name=$1
	shift

	test_expect_success "$name: is-bare-repository" \
	"test '$1' = \"\$(git rev-parse --is-bare-repository)\""
	shift
	[ $# -eq 0 ] && return

	test_expect_success "$name: is-inside-git-dir" \
	"test '$1' = \"\$(git rev-parse --is-inside-git-dir)\""
	shift
	[ $# -eq 0 ] && return

	test_expect_success "$name: is-inside-work-tree" \
	"test '$1' = \"\$(git rev-parse --is-inside-work-tree)\""
	shift
	[ $# -eq 0 ] && return

	test_expect_success "$name: prefix" \
	"test '$1' = \"\$(git rev-parse --show-prefix)\""
	shift
	[ $# -eq 0 ] && return
}

mkdir -p work/sub/dir || exit 1
mv .git repo.git || exit 1

say "core.worktree = relative path"
export GIT_DIR=repo.git
36
export GIT_CONFIG="$(pwd)"/$GIT_DIR/config
M
Matthias Lederhofer 已提交
37 38 39 40 41
unset GIT_WORK_TREE
git config core.worktree ../work
test_rev_parse 'outside'      false false false
cd work || exit 1
export GIT_DIR=../repo.git
42
export GIT_CONFIG="$(pwd)"/$GIT_DIR/config
M
Matthias Lederhofer 已提交
43 44 45
test_rev_parse 'inside'       false false true ''
cd sub/dir || exit 1
export GIT_DIR=../../../repo.git
46
export GIT_CONFIG="$(pwd)"/$GIT_DIR/config
M
Matthias Lederhofer 已提交
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
test_rev_parse 'subdirectory' false false true sub/dir/
cd ../../.. || exit 1

say "core.worktree = absolute path"
export GIT_DIR=$(pwd)/repo.git
export GIT_CONFIG=$GIT_DIR/config
git config core.worktree "$(pwd)/work"
test_rev_parse 'outside'      false false false
cd work || exit 1
test_rev_parse 'inside'       false false true ''
cd sub/dir || exit 1
test_rev_parse 'subdirectory' false false true sub/dir/
cd ../../.. || exit 1

say "GIT_WORK_TREE=relative path (override core.worktree)"
export GIT_DIR=$(pwd)/repo.git
export GIT_CONFIG=$GIT_DIR/config
git config core.worktree non-existent
export GIT_WORK_TREE=work
test_rev_parse 'outside'      false false false
cd work || exit 1
export GIT_WORK_TREE=.
test_rev_parse 'inside'       false false true ''
cd sub/dir || exit 1
export GIT_WORK_TREE=../..
test_rev_parse 'subdirectory' false false true sub/dir/
cd ../../.. || exit 1

mv work repo.git/work

say "GIT_WORK_TREE=absolute path, work tree below git dir"
export GIT_DIR=$(pwd)/repo.git
export GIT_CONFIG=$GIT_DIR/config
export GIT_WORK_TREE=$(pwd)/repo.git/work
test_rev_parse 'outside'              false false false
cd repo.git || exit 1
test_rev_parse 'in repo.git'              false true  false
cd objects || exit 1
test_rev_parse 'in repo.git/objects'      false true  false
cd ../work || exit 1
87
test_rev_parse 'in repo.git/work'         false true true ''
M
Matthias Lederhofer 已提交
88
cd sub/dir || exit 1
89
test_rev_parse 'in repo.git/sub/dir' false true true sub/dir/
M
Matthias Lederhofer 已提交
90 91
cd ../../../.. || exit 1

92 93 94 95 96 97 98 99 100 101 102 103 104 105
test_expect_success 'repo finds its work tree' '
	(cd repo.git &&
	 : > work/sub/dir/untracked &&
	 test sub/dir/untracked = "$(git ls-files --others)")
'

test_expect_success 'repo finds its work tree from work tree, too' '
	(cd repo.git/work/sub/dir &&
	 : > tracked &&
	 git --git-dir=../../.. add tracked &&
	 cd ../../.. &&
	 test sub/dir/tracked = "$(git ls-files)")
'

106 107 108 109 110 111 112 113 114
test_expect_success '_gently() groks relative GIT_DIR & GIT_WORK_TREE' '
	cd repo.git/work/sub/dir &&
	GIT_DIR=../../.. GIT_WORK_TREE=../.. GIT_PAGER= \
		git diff --exit-code tracked &&
	echo changed > tracked &&
	! GIT_DIR=../../.. GIT_WORK_TREE=../.. GIT_PAGER= \
		git diff --exit-code tracked
'

M
Matthias Lederhofer 已提交
115
test_done