]>
Commit | Line | Data |
---|---|---|
d8d25acb | 1 | #include "clar_libgit2.h" |
22a2d3d5 | 2 | #include "futils.h" |
d8d25acb | 3 | |
eae0bfdc PP |
4 | static git_config *cfg; |
5 | static git_buf buf; | |
6 | ||
7 | void test_config_include__initialize(void) | |
8 | { | |
e579e0f7 MB |
9 | cfg = NULL; |
10 | memset(&buf, 0, sizeof(git_buf)); | |
eae0bfdc PP |
11 | } |
12 | ||
13 | void test_config_include__cleanup(void) | |
d8d25acb | 14 | { |
e579e0f7 MB |
15 | git_config_free(cfg); |
16 | git_buf_dispose(&buf); | |
eae0bfdc | 17 | } |
d8d25acb | 18 | |
eae0bfdc PP |
19 | void test_config_include__relative(void) |
20 | { | |
d8d25acb CMN |
21 | cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config-include"))); |
22 | ||
9a97f49e | 23 | cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar.baz")); |
e579e0f7 | 24 | cl_assert_equal_s("huzzah", buf.ptr); |
d8d25acb CMN |
25 | } |
26 | ||
27 | void test_config_include__absolute(void) | |
28 | { | |
e579e0f7 MB |
29 | git_str cfgdata = GIT_STR_INIT; |
30 | cl_git_pass(git_str_printf(&cfgdata, "[include]\npath = %s/config-included", cl_fixture("config"))); | |
31 | ||
32 | cl_git_mkfile("config-include-absolute", cfgdata.ptr); | |
33 | git_str_dispose(&cfgdata); | |
d8d25acb | 34 | |
d8d25acb CMN |
35 | cl_git_pass(git_config_open_ondisk(&cfg, "config-include-absolute")); |
36 | ||
9a97f49e | 37 | cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar.baz")); |
e579e0f7 | 38 | cl_assert_equal_s("huzzah", buf.ptr); |
6c7cee42 RD |
39 | |
40 | cl_git_pass(p_unlink("config-include-absolute")); | |
d8d25acb CMN |
41 | } |
42 | ||
43 | void test_config_include__homedir(void) | |
44 | { | |
d8d25acb CMN |
45 | cl_git_pass(git_libgit2_opts(GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, cl_fixture("config"))); |
46 | cl_git_mkfile("config-include-homedir", "[include]\npath = ~/config-included"); | |
47 | ||
48 | cl_git_pass(git_config_open_ondisk(&cfg, "config-include-homedir")); | |
49 | ||
9a97f49e | 50 | cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar.baz")); |
e579e0f7 | 51 | cl_assert_equal_s("huzzah", buf.ptr); |
d8d25acb | 52 | |
8487e237 | 53 | cl_sandbox_set_search_path_defaults(); |
6c7cee42 RD |
54 | |
55 | cl_git_pass(p_unlink("config-include-homedir")); | |
d8d25acb | 56 | } |
a9fb7989 | 57 | |
73fc5e01 CMN |
58 | /* We need to pretend that the variables were defined where the file was included */ |
59 | void test_config_include__ordering(void) | |
60 | { | |
73fc5e01 CMN |
61 | cl_git_mkfile("included", "[foo \"bar\"]\nbaz = hurrah\nfrotz = hiya"); |
62 | cl_git_mkfile("including", | |
63 | "[foo \"bar\"]\nfrotz = hello\n" | |
64 | "[include]\npath = included\n" | |
65 | "[foo \"bar\"]\nbaz = huzzah\n"); | |
66 | ||
67 | cl_git_pass(git_config_open_ondisk(&cfg, "including")); | |
68 | ||
9a97f49e | 69 | cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar.frotz")); |
e579e0f7 MB |
70 | cl_assert_equal_s("hiya", buf.ptr); |
71 | git_buf_dispose(&buf); | |
9a97f49e | 72 | cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar.baz")); |
e579e0f7 | 73 | cl_assert_equal_s("huzzah", buf.ptr); |
6c7cee42 RD |
74 | |
75 | cl_git_pass(p_unlink("included")); | |
76 | cl_git_pass(p_unlink("including")); | |
73fc5e01 | 77 | } |
53ea0513 CMN |
78 | |
79 | /* We need to pretend that the variables were defined where the file was included */ | |
80 | void test_config_include__depth(void) | |
81 | { | |
53ea0513 CMN |
82 | cl_git_mkfile("a", "[include]\npath = b"); |
83 | cl_git_mkfile("b", "[include]\npath = a"); | |
84 | ||
85 | cl_git_fail(git_config_open_ondisk(&cfg, "a")); | |
86 | ||
6c7cee42 RD |
87 | cl_git_pass(p_unlink("a")); |
88 | cl_git_pass(p_unlink("b")); | |
89 | } | |
90 | ||
91 | void test_config_include__empty_path_sanely_handled(void) | |
92 | { | |
93 | cl_git_mkfile("a", "[include]\npath"); | |
94 | cl_git_pass(git_config_open_ondisk(&cfg, "a")); | |
95 | cl_git_pass(git_config_get_string_buf(&buf, cfg, "include.path")); | |
e579e0f7 | 96 | cl_assert_equal_s("", buf.ptr); |
6c7cee42 RD |
97 | |
98 | cl_git_pass(p_unlink("a")); | |
53ea0513 | 99 | } |
727ae380 JF |
100 | |
101 | void test_config_include__missing(void) | |
102 | { | |
ebc13b2b | 103 | cl_git_mkfile("including", "[include]\npath = nonexistentfile\n[foo]\nbar = baz"); |
047fe29c | 104 | |
ac3d33df | 105 | git_error_clear(); |
047fe29c | 106 | cl_git_pass(git_config_open_ondisk(&cfg, "including")); |
ac3d33df | 107 | cl_assert(git_error_last() == NULL); |
047fe29c | 108 | cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar")); |
e579e0f7 | 109 | cl_assert_equal_s("baz", buf.ptr); |
6c7cee42 RD |
110 | |
111 | cl_git_pass(p_unlink("including")); | |
047fe29c SD |
112 | } |
113 | ||
114 | void test_config_include__missing_homedir(void) | |
115 | { | |
ed812ee7 | 116 | cl_git_pass(git_libgit2_opts(GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, cl_fixture("config"))); |
047fe29c | 117 | cl_git_mkfile("including", "[include]\npath = ~/.nonexistentfile\n[foo]\nbar = baz"); |
727ae380 | 118 | |
ac3d33df | 119 | git_error_clear(); |
ebc13b2b | 120 | cl_git_pass(git_config_open_ondisk(&cfg, "including")); |
ac3d33df | 121 | cl_assert(git_error_last() == NULL); |
9a97f49e | 122 | cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar")); |
e579e0f7 | 123 | cl_assert_equal_s("baz", buf.ptr); |
727ae380 | 124 | |
ed812ee7 | 125 | cl_sandbox_set_search_path_defaults(); |
6c7cee42 | 126 | cl_git_pass(p_unlink("including")); |
727ae380 | 127 | } |
3ea78f24 YK |
128 | |
129 | #define replicate10(s) s s s s s s s s s s | |
130 | void test_config_include__depth2(void) | |
131 | { | |
3ea78f24 YK |
132 | const char *content = "[include]\n" replicate10(replicate10("path=bottom\n")); |
133 | ||
134 | cl_git_mkfile("top-level", "[include]\npath = middle\n[foo]\nbar = baz"); | |
135 | cl_git_mkfile("middle", content); | |
136 | cl_git_mkfile("bottom", "[foo]\nbar2 = baz2"); | |
137 | ||
138 | cl_git_pass(git_config_open_ondisk(&cfg, "top-level")); | |
139 | ||
9a97f49e | 140 | cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar")); |
e579e0f7 | 141 | cl_assert_equal_s("baz", buf.ptr); |
3ea78f24 | 142 | |
e579e0f7 | 143 | git_buf_dispose(&buf); |
9a97f49e | 144 | cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar2")); |
e579e0f7 | 145 | cl_assert_equal_s("baz2", buf.ptr); |
6c7cee42 RD |
146 | |
147 | cl_git_pass(p_unlink("top-level")); | |
148 | cl_git_pass(p_unlink("middle")); | |
149 | cl_git_pass(p_unlink("bottom")); | |
eae0bfdc | 150 | } |
3ea78f24 | 151 | |
eae0bfdc PP |
152 | void test_config_include__removing_include_removes_values(void) |
153 | { | |
154 | cl_git_mkfile("top-level", "[include]\npath = included"); | |
155 | cl_git_mkfile("included", "[foo]\nbar = value"); | |
156 | ||
157 | cl_git_pass(git_config_open_ondisk(&cfg, "top-level")); | |
158 | cl_git_mkfile("top-level", ""); | |
159 | cl_git_fail(git_config_get_string_buf(&buf, cfg, "foo.bar")); | |
6c7cee42 RD |
160 | |
161 | cl_git_pass(p_unlink("top-level")); | |
162 | cl_git_pass(p_unlink("included")); | |
eae0bfdc PP |
163 | } |
164 | ||
165 | void test_config_include__rewriting_include_refreshes_values(void) | |
166 | { | |
167 | cl_git_mkfile("top-level", "[include]\npath = first\n[include]\npath = second"); | |
168 | cl_git_mkfile("first", "[first]\nfoo = bar"); | |
169 | cl_git_mkfile("second", "[second]\nfoo = bar"); | |
170 | ||
171 | cl_git_pass(git_config_open_ondisk(&cfg, "top-level")); | |
172 | cl_git_mkfile("first", "[first]\nother = value"); | |
173 | cl_git_fail(git_config_get_string_buf(&buf, cfg, "foo.bar")); | |
174 | cl_git_pass(git_config_get_string_buf(&buf, cfg, "first.other")); | |
175 | cl_assert_equal_s(buf.ptr, "value"); | |
6c7cee42 RD |
176 | |
177 | cl_git_pass(p_unlink("top-level")); | |
178 | cl_git_pass(p_unlink("first")); | |
179 | cl_git_pass(p_unlink("second")); | |
eae0bfdc PP |
180 | } |
181 | ||
c25aa7cd PP |
182 | void test_config_include__rewriting_include_twice_refreshes_values(void) |
183 | { | |
184 | cl_git_mkfile("top-level", "[include]\npath = included"); | |
185 | cl_git_mkfile("included", "[foo]\nbar = first-value"); | |
186 | ||
187 | cl_git_pass(git_config_open_ondisk(&cfg, "top-level")); | |
188 | cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.bar")); | |
189 | ||
e579e0f7 | 190 | git_buf_dispose(&buf); |
c25aa7cd PP |
191 | cl_git_mkfile("included", "[foo]\nother = value2"); |
192 | cl_git_fail(git_config_get_string_buf(&buf, cfg, "foo.bar")); | |
193 | cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.other")); | |
194 | cl_assert_equal_s(buf.ptr, "value2"); | |
195 | ||
e579e0f7 | 196 | git_buf_dispose(&buf); |
c25aa7cd PP |
197 | cl_git_mkfile("included", "[foo]\nanother = bar"); |
198 | cl_git_fail(git_config_get_string_buf(&buf, cfg, "foo.other")); | |
199 | cl_git_pass(git_config_get_string_buf(&buf, cfg, "foo.another")); | |
200 | cl_assert_equal_s(buf.ptr, "bar"); | |
201 | ||
202 | cl_git_pass(p_unlink("top-level")); | |
203 | cl_git_pass(p_unlink("included")); | |
204 | } | |
205 | ||
eae0bfdc PP |
206 | void test_config_include__included_variables_cannot_be_deleted(void) |
207 | { | |
208 | cl_git_mkfile("top-level", "[include]\npath = included\n"); | |
209 | cl_git_mkfile("included", "[foo]\nbar = value"); | |
210 | ||
211 | cl_git_pass(git_config_open_ondisk(&cfg, "top-level")); | |
212 | cl_git_fail(git_config_delete_entry(cfg, "foo.bar")); | |
6c7cee42 RD |
213 | |
214 | cl_git_pass(p_unlink("top-level")); | |
215 | cl_git_pass(p_unlink("included")); | |
eae0bfdc PP |
216 | } |
217 | ||
218 | void test_config_include__included_variables_cannot_be_modified(void) | |
219 | { | |
220 | cl_git_mkfile("top-level", "[include]\npath = included\n"); | |
6c7cee42 | 221 | |
eae0bfdc PP |
222 | cl_git_mkfile("included", "[foo]\nbar = value"); |
223 | ||
224 | cl_git_pass(git_config_open_ondisk(&cfg, "top-level")); | |
225 | cl_git_fail(git_config_set_string(cfg, "foo.bar", "other-value")); | |
6c7cee42 RD |
226 | |
227 | cl_git_pass(p_unlink("top-level")); | |
228 | cl_git_pass(p_unlink("included")); | |
3ea78f24 | 229 | } |
22a2d3d5 UG |
230 | |
231 | void test_config_include__variables_in_included_override_including(void) | |
232 | { | |
233 | int i; | |
234 | ||
235 | cl_git_mkfile("top-level", "[foo]\nbar = 1\n[include]\npath = included"); | |
236 | cl_git_mkfile("included", "[foo]\nbar = 2"); | |
237 | ||
238 | cl_git_pass(git_config_open_ondisk(&cfg, "top-level")); | |
239 | cl_git_pass(git_config_get_int32(&i, cfg, "foo.bar")); | |
240 | cl_assert_equal_i(i, 2); | |
241 | ||
242 | cl_git_pass(p_unlink("top-level")); | |
243 | cl_git_pass(p_unlink("included")); | |
244 | } | |
245 | ||
246 | void test_config_include__variables_in_including_override_included(void) | |
247 | { | |
248 | int i; | |
249 | ||
250 | cl_git_mkfile("top-level", "[include]\npath = included\n[foo]\nbar = 1"); | |
251 | cl_git_mkfile("included", "[foo]\nbar = 2"); | |
252 | ||
253 | cl_git_pass(git_config_open_ondisk(&cfg, "top-level")); | |
254 | cl_git_pass(git_config_get_int32(&i, cfg, "foo.bar")); | |
255 | cl_assert_equal_i(i, 1); | |
256 | ||
257 | cl_git_pass(p_unlink("top-level")); | |
258 | cl_git_pass(p_unlink("included")); | |
259 | } |