Merge branch 'sb/checkout-recurse-submodules' into next
[git] / t / t1305-config-include.sh
1 #!/bin/sh
2
3 test_description='test config file include directives'
4 . ./test-lib.sh
5
6 test_expect_success 'include file by absolute path' '
7         echo "[test]one = 1" >one &&
8         echo "[include]path = \"$(pwd)/one\"" >.gitconfig &&
9         echo 1 >expect &&
10         git config test.one >actual &&
11         test_cmp expect actual
12 '
13
14 test_expect_success 'include file by relative path' '
15         echo "[test]one = 1" >one &&
16         echo "[include]path = one" >.gitconfig &&
17         echo 1 >expect &&
18         git config test.one >actual &&
19         test_cmp expect actual
20 '
21
22 test_expect_success 'chained relative paths' '
23         mkdir subdir &&
24         echo "[test]three = 3" >subdir/three &&
25         echo "[include]path = three" >subdir/two &&
26         echo "[include]path = subdir/two" >.gitconfig &&
27         echo 3 >expect &&
28         git config test.three >actual &&
29         test_cmp expect actual
30 '
31
32 test_expect_success 'include paths get tilde-expansion' '
33         echo "[test]one = 1" >one &&
34         echo "[include]path = ~/one" >.gitconfig &&
35         echo 1 >expect &&
36         git config test.one >actual &&
37         test_cmp expect actual
38 '
39
40 test_expect_success 'include options can still be examined' '
41         echo "[test]one = 1" >one &&
42         echo "[include]path = one" >.gitconfig &&
43         echo one >expect &&
44         git config include.path >actual &&
45         test_cmp expect actual
46 '
47
48 test_expect_success 'listing includes option and expansion' '
49         echo "[test]one = 1" >one &&
50         echo "[include]path = one" >.gitconfig &&
51         cat >expect <<-\EOF &&
52         include.path=one
53         test.one=1
54         EOF
55         git config --list >actual.full &&
56         grep -v ^core actual.full >actual &&
57         test_cmp expect actual
58 '
59
60 test_expect_success 'single file lookup does not expand includes by default' '
61         echo "[test]one = 1" >one &&
62         echo "[include]path = one" >.gitconfig &&
63         test_must_fail git config -f .gitconfig test.one &&
64         test_must_fail git config --global test.one &&
65         echo 1 >expect &&
66         git config --includes -f .gitconfig test.one >actual &&
67         test_cmp expect actual
68 '
69
70 test_expect_success 'single file list does not expand includes by default' '
71         echo "[test]one = 1" >one &&
72         echo "[include]path = one" >.gitconfig &&
73         echo "include.path=one" >expect &&
74         git config -f .gitconfig --list >actual &&
75         test_cmp expect actual
76 '
77
78 test_expect_success 'writing config file does not expand includes' '
79         echo "[test]one = 1" >one &&
80         echo "[include]path = one" >.gitconfig &&
81         git config test.two 2 &&
82         echo 2 >expect &&
83         git config --no-includes test.two >actual &&
84         test_cmp expect actual &&
85         test_must_fail git config --no-includes test.one
86 '
87
88 test_expect_success 'config modification does not affect includes' '
89         echo "[test]one = 1" >one &&
90         echo "[include]path = one" >.gitconfig &&
91         git config test.one 2 &&
92         echo 1 >expect &&
93         git config -f one test.one >actual &&
94         test_cmp expect actual &&
95         cat >expect <<-\EOF &&
96         1
97         2
98         EOF
99         git config --get-all test.one >actual &&
100         test_cmp expect actual
101 '
102
103 test_expect_success 'missing include files are ignored' '
104         cat >.gitconfig <<-\EOF &&
105         [include]path = non-existent
106         [test]value = yes
107         EOF
108         echo yes >expect &&
109         git config test.value >actual &&
110         test_cmp expect actual
111 '
112
113 test_expect_success 'absolute includes from command line work' '
114         echo "[test]one = 1" >one &&
115         echo 1 >expect &&
116         git -c include.path="$(pwd)/one" config test.one >actual &&
117         test_cmp expect actual
118 '
119
120 test_expect_success 'relative includes from command line fail' '
121         echo "[test]one = 1" >one &&
122         test_must_fail git -c include.path=one config test.one
123 '
124
125 test_expect_success 'absolute includes from blobs work' '
126         echo "[test]one = 1" >one &&
127         echo "[include]path=$(pwd)/one" >blob &&
128         blob=$(git hash-object -w blob) &&
129         echo 1 >expect &&
130         git config --blob=$blob test.one >actual &&
131         test_cmp expect actual
132 '
133
134 test_expect_success 'relative includes from blobs fail' '
135         echo "[test]one = 1" >one &&
136         echo "[include]path=one" >blob &&
137         blob=$(git hash-object -w blob) &&
138         test_must_fail git config --blob=$blob test.one
139 '
140
141 test_expect_success 'absolute includes from stdin work' '
142         echo "[test]one = 1" >one &&
143         echo 1 >expect &&
144         echo "[include]path=\"$(pwd)/one\"" |
145         git config --file - test.one >actual &&
146         test_cmp expect actual
147 '
148
149 test_expect_success 'relative includes from stdin line fail' '
150         echo "[test]one = 1" >one &&
151         echo "[include]path=one" |
152         test_must_fail git config --file - test.one
153 '
154
155 test_expect_success 'conditional include, both unanchored' '
156         git init foo &&
157         (
158                 cd foo &&
159                 echo "[includeIf \"gitdir:foo/\"]path=bar" >>.git/config &&
160                 echo "[test]one=1" >.git/bar &&
161                 echo 1 >expect &&
162                 git config test.one >actual &&
163                 test_cmp expect actual
164         )
165 '
166
167 test_expect_success 'conditional include, $HOME expansion' '
168         (
169                 cd foo &&
170                 echo "[includeIf \"gitdir:~/foo/\"]path=bar2" >>.git/config &&
171                 echo "[test]two=2" >.git/bar2 &&
172                 echo 2 >expect &&
173                 git config test.two >actual &&
174                 test_cmp expect actual
175         )
176 '
177
178 test_expect_success 'conditional include, full pattern' '
179         (
180                 cd foo &&
181                 echo "[includeIf \"gitdir:**/foo/**\"]path=bar3" >>.git/config &&
182                 echo "[test]three=3" >.git/bar3 &&
183                 echo 3 >expect &&
184                 git config test.three >actual &&
185                 test_cmp expect actual
186         )
187 '
188
189 test_expect_success 'conditional include, relative path' '
190         echo "[includeIf \"gitdir:./foo/.git\"]path=bar4" >>.gitconfig &&
191         echo "[test]four=4" >bar4 &&
192         (
193                 cd foo &&
194                 echo 4 >expect &&
195                 git config test.four >actual &&
196                 test_cmp expect actual
197         )
198 '
199
200 test_expect_success 'conditional include, both unanchored, icase' '
201         (
202                 cd foo &&
203                 echo "[includeIf \"gitdir/i:FOO/\"]path=bar5" >>.git/config &&
204                 echo "[test]five=5" >.git/bar5 &&
205                 echo 5 >expect &&
206                 git config test.five >actual &&
207                 test_cmp expect actual
208         )
209 '
210
211 test_expect_success 'include cycles are detected' '
212         cat >.gitconfig <<-\EOF &&
213         [test]value = gitconfig
214         [include]path = cycle
215         EOF
216         cat >cycle <<-\EOF &&
217         [test]value = cycle
218         [include]path = .gitconfig
219         EOF
220         cat >expect <<-\EOF &&
221         gitconfig
222         cycle
223         EOF
224         test_must_fail git config --get-all test.value 2>stderr &&
225         grep "exceeded maximum include depth" stderr
226 '
227
228 test_done