worktree: handle broken symrefs in find_shared_symref()
[git.git] / t / t1305-config-include.sh
blobd9d2f545a4ed735e02f7d5cd6ceee7d873fdec94
1 #!/bin/sh
3 test_description='test config file include directives'
4 . ./test-lib.sh
6 # Force setup_explicit_git_dir() to run until the end. This is needed
7 # by some tests to make sure real_path() is called on $GIT_DIR. The
8 # caller needs to make sure git commands are run from a subdirectory
9 # though or real_path() will not be called.
10 force_setup_explicit_git_dir() {
11 GIT_DIR="$(pwd)/.git"
12 GIT_WORK_TREE="$(pwd)"
13 export GIT_DIR GIT_WORK_TREE
16 test_expect_success 'include file by absolute path' '
17 echo "[test]one = 1" >one &&
18 echo "[include]path = \"$(pwd)/one\"" >.gitconfig &&
19 echo 1 >expect &&
20 git config test.one >actual &&
21 test_cmp expect actual
24 test_expect_success 'include file by relative path' '
25 echo "[test]one = 1" >one &&
26 echo "[include]path = one" >.gitconfig &&
27 echo 1 >expect &&
28 git config test.one >actual &&
29 test_cmp expect actual
32 test_expect_success 'chained relative paths' '
33 mkdir subdir &&
34 echo "[test]three = 3" >subdir/three &&
35 echo "[include]path = three" >subdir/two &&
36 echo "[include]path = subdir/two" >.gitconfig &&
37 echo 3 >expect &&
38 git config test.three >actual &&
39 test_cmp expect actual
42 test_expect_success 'include paths get tilde-expansion' '
43 echo "[test]one = 1" >one &&
44 echo "[include]path = ~/one" >.gitconfig &&
45 echo 1 >expect &&
46 git config test.one >actual &&
47 test_cmp expect actual
50 test_expect_success 'include options can still be examined' '
51 echo "[test]one = 1" >one &&
52 echo "[include]path = one" >.gitconfig &&
53 echo one >expect &&
54 git config include.path >actual &&
55 test_cmp expect actual
58 test_expect_success 'listing includes option and expansion' '
59 echo "[test]one = 1" >one &&
60 echo "[include]path = one" >.gitconfig &&
61 cat >expect <<-\EOF &&
62 include.path=one
63 test.one=1
64 EOF
65 git config --list >actual.full &&
66 grep -v ^core actual.full >actual &&
67 test_cmp expect actual
70 test_expect_success 'single file lookup does not expand includes by default' '
71 echo "[test]one = 1" >one &&
72 echo "[include]path = one" >.gitconfig &&
73 test_must_fail git config -f .gitconfig test.one &&
74 test_must_fail git config --global test.one &&
75 echo 1 >expect &&
76 git config --includes -f .gitconfig test.one >actual &&
77 test_cmp expect actual
80 test_expect_success 'single file list does not expand includes by default' '
81 echo "[test]one = 1" >one &&
82 echo "[include]path = one" >.gitconfig &&
83 echo "include.path=one" >expect &&
84 git config -f .gitconfig --list >actual &&
85 test_cmp expect actual
88 test_expect_success 'writing config file does not expand includes' '
89 echo "[test]one = 1" >one &&
90 echo "[include]path = one" >.gitconfig &&
91 git config test.two 2 &&
92 echo 2 >expect &&
93 git config --no-includes test.two >actual &&
94 test_cmp expect actual &&
95 test_must_fail git config --no-includes test.one
98 test_expect_success 'config modification does not affect includes' '
99 echo "[test]one = 1" >one &&
100 echo "[include]path = one" >.gitconfig &&
101 git config test.one 2 &&
102 echo 1 >expect &&
103 git config -f one test.one >actual &&
104 test_cmp expect actual &&
105 cat >expect <<-\EOF &&
109 git config --get-all test.one >actual &&
110 test_cmp expect actual
113 test_expect_success 'missing include files are ignored' '
114 cat >.gitconfig <<-\EOF &&
115 [include]path = non-existent
116 [test]value = yes
118 echo yes >expect &&
119 git config test.value >actual &&
120 test_cmp expect actual
123 test_expect_success 'absolute includes from command line work' '
124 echo "[test]one = 1" >one &&
125 echo 1 >expect &&
126 git -c include.path="$(pwd)/one" config test.one >actual &&
127 test_cmp expect actual
130 test_expect_success 'relative includes from command line fail' '
131 echo "[test]one = 1" >one &&
132 test_must_fail git -c include.path=one config test.one
135 test_expect_success 'absolute includes from blobs work' '
136 echo "[test]one = 1" >one &&
137 echo "[include]path=$(pwd)/one" >blob &&
138 blob=$(git hash-object -w blob) &&
139 echo 1 >expect &&
140 git config --blob=$blob test.one >actual &&
141 test_cmp expect actual
144 test_expect_success 'relative includes from blobs fail' '
145 echo "[test]one = 1" >one &&
146 echo "[include]path=one" >blob &&
147 blob=$(git hash-object -w blob) &&
148 test_must_fail git config --blob=$blob test.one
151 test_expect_success 'absolute includes from stdin work' '
152 echo "[test]one = 1" >one &&
153 echo 1 >expect &&
154 echo "[include]path=\"$(pwd)/one\"" |
155 git config --file - test.one >actual &&
156 test_cmp expect actual
159 test_expect_success 'relative includes from stdin line fail' '
160 echo "[test]one = 1" >one &&
161 echo "[include]path=one" |
162 test_must_fail git config --file - test.one
165 test_expect_success 'conditional include, both unanchored' '
166 git init foo &&
168 cd foo &&
169 echo "[includeIf \"gitdir:foo/\"]path=bar" >>.git/config &&
170 echo "[test]one=1" >.git/bar &&
171 echo 1 >expect &&
172 git config test.one >actual &&
173 test_cmp expect actual
177 test_expect_success 'conditional include, $HOME expansion' '
179 cd foo &&
180 echo "[includeIf \"gitdir:~/foo/\"]path=bar2" >>.git/config &&
181 echo "[test]two=2" >.git/bar2 &&
182 echo 2 >expect &&
183 git config test.two >actual &&
184 test_cmp expect actual
188 test_expect_success 'conditional include, full pattern' '
190 cd foo &&
191 echo "[includeIf \"gitdir:**/foo/**\"]path=bar3" >>.git/config &&
192 echo "[test]three=3" >.git/bar3 &&
193 echo 3 >expect &&
194 git config test.three >actual &&
195 test_cmp expect actual
199 test_expect_success 'conditional include, relative path' '
200 echo "[includeIf \"gitdir:./foo/.git\"]path=bar4" >>.gitconfig &&
201 echo "[test]four=4" >bar4 &&
203 cd foo &&
204 echo 4 >expect &&
205 git config test.four >actual &&
206 test_cmp expect actual
210 test_expect_success 'conditional include, both unanchored, icase' '
212 cd foo &&
213 echo "[includeIf \"gitdir/i:FOO/\"]path=bar5" >>.git/config &&
214 echo "[test]five=5" >.git/bar5 &&
215 echo 5 >expect &&
216 git config test.five >actual &&
217 test_cmp expect actual
221 test_expect_success 'conditional include, early config reading' '
223 cd foo &&
224 echo "[includeIf \"gitdir:foo/\"]path=bar6" >>.git/config &&
225 echo "[test]six=6" >.git/bar6 &&
226 echo 6 >expect &&
227 test-config read_early_config test.six >actual &&
228 test_cmp expect actual
232 test_expect_success SYMLINKS 'conditional include, set up symlinked $HOME' '
233 mkdir real-home &&
234 ln -s real-home home &&
236 HOME="$TRASH_DIRECTORY/home" &&
237 export HOME &&
238 cd "$HOME" &&
240 git init foo &&
241 cd foo &&
242 mkdir sub
246 test_expect_success SYMLINKS 'conditional include, $HOME expansion with symlinks' '
248 HOME="$TRASH_DIRECTORY/home" &&
249 export HOME &&
250 cd "$HOME"/foo &&
252 echo "[includeIf \"gitdir:~/foo/\"]path=bar2" >>.git/config &&
253 echo "[test]two=2" >.git/bar2 &&
254 echo 2 >expect &&
255 force_setup_explicit_git_dir &&
256 git -C sub config test.two >actual &&
257 test_cmp expect actual
261 test_expect_success SYMLINKS 'conditional include, relative path with symlinks' '
262 echo "[includeIf \"gitdir:./foo/.git\"]path=bar4" >home/.gitconfig &&
263 echo "[test]four=4" >home/bar4 &&
265 HOME="$TRASH_DIRECTORY/home" &&
266 export HOME &&
267 cd "$HOME"/foo &&
269 echo 4 >expect &&
270 force_setup_explicit_git_dir &&
271 git -C sub config test.four >actual &&
272 test_cmp expect actual
276 test_expect_success SYMLINKS 'conditional include, gitdir matching symlink' '
277 ln -s foo bar &&
279 cd bar &&
280 echo "[includeIf \"gitdir:bar/\"]path=bar7" >>.git/config &&
281 echo "[test]seven=7" >.git/bar7 &&
282 echo 7 >expect &&
283 git config test.seven >actual &&
284 test_cmp expect actual
288 test_expect_success SYMLINKS 'conditional include, gitdir matching symlink, icase' '
290 cd bar &&
291 echo "[includeIf \"gitdir/i:BAR/\"]path=bar8" >>.git/config &&
292 echo "[test]eight=8" >.git/bar8 &&
293 echo 8 >expect &&
294 git config test.eight >actual &&
295 test_cmp expect actual
299 test_expect_success 'include cycles are detected' '
300 cat >.gitconfig <<-\EOF &&
301 [test]value = gitconfig
302 [include]path = cycle
304 cat >cycle <<-\EOF &&
305 [test]value = cycle
306 [include]path = .gitconfig
308 cat >expect <<-\EOF &&
309 gitconfig
310 cycle
312 test_must_fail git config --get-all test.value 2>stderr &&
313 grep "exceeded maximum include depth" stderr
316 test_done