t1510: setup case #1
[git] / t / t1510-repo-setup.sh
1 #!/bin/sh
2
3 test_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
42 test_repo() {
43         (
44         cd "$1" &&
45         if test -n "$2"; then GIT_DIR="$2" && export GIT_DIR; fi &&
46         if test -n "$3"; then GIT_WORK_TREE="$3" && export GIT_WORK_TREE; fi &&
47         rm -f trace &&
48         GIT_TRACE="`pwd`/trace" git symbolic-ref HEAD >/dev/null &&
49         grep '^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
82 test_expect_success '#0: setup' '
83         unset GIT_DIR GIT_WORK_TREE &&
84         mkdir 0 0/sub &&
85         cd 0 && git init && cd ..
86 '
87
88 test_expect_success '#0: at root' '
89         cat >0/expected <<EOF &&
90 setup: git_dir: .git
91 setup: worktree: $TRASH_DIRECTORY/0
92 setup: cwd: $TRASH_DIRECTORY/0
93 setup: prefix: (null)
94 EOF
95         test_repo 0
96 '
97
98 test_expect_success '#0: in subdir' '
99         cat >0/sub/expected <<EOF &&
100 setup: git_dir: .git
101 setup: worktree: $TRASH_DIRECTORY/0
102 setup: cwd: $TRASH_DIRECTORY/0
103 setup: prefix: sub/
104 EOF
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
125 test_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
135 test_expect_failure '#1: at root' '
136         cat >1/expected <<EOF &&
137 setup: git_dir: .git
138 setup: worktree: $TRASH_DIRECTORY/1
139 setup: cwd: $TRASH_DIRECTORY/1
140 setup: prefix: (null)
141 EOF
142         test_repo 1
143 '
144
145 test_expect_failure '#1: in subdir' '
146         cat >1/sub/expected <<EOF &&
147 setup: git_dir: .git
148 setup: worktree: $TRASH_DIRECTORY/1
149 setup: cwd: $TRASH_DIRECTORY/1
150 setup: prefix: sub/
151 EOF
152         test_repo 1/sub
153 '
154
155 test_done