]> git.proxmox.com Git - libgit2.git/blob - tests/config/multivar.c
4f08a48172f355ed7f08907b73906319826b4430
[libgit2.git] / tests / config / multivar.c
1 #include "clar_libgit2.h"
2
3 static const char *_name = "remote.ab.url";
4
5 void test_config_multivar__initialize(void)
6 {
7 cl_fixture_sandbox("config");
8 }
9
10 void test_config_multivar__cleanup(void)
11 {
12 cl_fixture_cleanup("config");
13 }
14
15 static int mv_read_cb(const git_config_entry *entry, void *data)
16 {
17 int *n = (int *) data;
18
19 if (!strcmp(entry->name, _name))
20 (*n)++;
21
22 return 0;
23 }
24
25 void test_config_multivar__foreach(void)
26 {
27 git_config *cfg;
28 int n = 0;
29
30 cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config11")));
31
32 cl_git_pass(git_config_foreach(cfg, mv_read_cb, &n));
33 cl_assert(n == 2);
34
35 git_config_free(cfg);
36 }
37
38 static int cb(const git_config_entry *entry, void *data)
39 {
40 int *n = (int *) data;
41
42 GIT_UNUSED(entry);
43
44 (*n)++;
45
46 return 0;
47 }
48
49 static void check_get_multivar_foreach(
50 git_config *cfg, int expected, int expected_patterned)
51 {
52 int n = 0;
53
54 if (expected > 0) {
55 cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n));
56 cl_assert_equal_i(expected, n);
57 } else {
58 cl_assert_equal_i(GIT_ENOTFOUND,
59 git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n));
60 }
61
62 n = 0;
63
64 if (expected_patterned > 0) {
65 cl_git_pass(git_config_get_multivar_foreach(cfg, _name, "example", cb, &n));
66 cl_assert_equal_i(expected_patterned, n);
67 } else {
68 cl_assert_equal_i(GIT_ENOTFOUND,
69 git_config_get_multivar_foreach(cfg, _name, "example", cb, &n));
70 }
71 }
72
73 static void check_get_multivar(git_config *cfg, int expected)
74 {
75 git_config_iterator *iter;
76 git_config_entry *entry;
77 int n = 0;
78
79 cl_git_pass(git_config_multivar_iterator_new(&iter, cfg, _name, NULL));
80
81 while (git_config_next(&entry, iter) == 0)
82 n++;
83
84 cl_assert_equal_i(expected, n);
85 git_config_iterator_free(iter);
86
87 }
88
89 void test_config_multivar__get(void)
90 {
91 git_config *cfg;
92
93 cl_git_pass(git_config_open_ondisk(&cfg, "config/config11"));
94 check_get_multivar_foreach(cfg, 2, 1);
95
96 /* add another that has the _name entry */
97 cl_git_pass(git_config_add_file_ondisk(cfg, "config/config9", GIT_CONFIG_LEVEL_SYSTEM, NULL, 1));
98 check_get_multivar_foreach(cfg, 3, 2);
99
100 /* add another that does not have the _name entry */
101 cl_git_pass(git_config_add_file_ondisk(cfg, "config/config0", GIT_CONFIG_LEVEL_GLOBAL, NULL, 1));
102 check_get_multivar_foreach(cfg, 3, 2);
103
104 /* add another that does not have the _name entry at the end */
105 cl_git_pass(git_config_add_file_ondisk(cfg, "config/config1", GIT_CONFIG_LEVEL_APP, NULL, 1));
106 check_get_multivar_foreach(cfg, 3, 2);
107
108 /* drop original file */
109 cl_git_pass(git_config_add_file_ondisk(cfg, "config/config2", GIT_CONFIG_LEVEL_LOCAL, NULL, 1));
110 check_get_multivar_foreach(cfg, 1, 1);
111
112 /* drop other file with match */
113 cl_git_pass(git_config_add_file_ondisk(cfg, "config/config3", GIT_CONFIG_LEVEL_SYSTEM, NULL, 1));
114 check_get_multivar_foreach(cfg, 0, 0);
115
116 /* reload original file (add different place in order) */
117 cl_git_pass(git_config_add_file_ondisk(cfg, "config/config11", GIT_CONFIG_LEVEL_SYSTEM, NULL, 1));
118 check_get_multivar_foreach(cfg, 2, 1);
119
120 check_get_multivar(cfg, 2);
121
122 git_config_free(cfg);
123 }
124
125 void test_config_multivar__add(void)
126 {
127 git_config *cfg;
128 int n;
129
130 cl_git_pass(git_config_open_ondisk(&cfg, "config/config11"));
131 cl_git_pass(git_config_set_multivar(cfg, _name, "nonexistant", "git://git.otherplace.org/libgit2"));
132
133 n = 0;
134 cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n));
135 cl_assert_equal_i(n, 3);
136
137 n = 0;
138 cl_git_pass(git_config_get_multivar_foreach(cfg, _name, "otherplace", cb, &n));
139 cl_assert_equal_i(n, 1);
140
141 git_config_free(cfg);
142
143 /* We know it works in memory, let's see if the file is written correctly */
144
145 cl_git_pass(git_config_open_ondisk(&cfg, "config/config11"));
146
147 n = 0;
148 cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n));
149 cl_assert_equal_i(n, 3);
150
151 n = 0;
152 cl_git_pass(git_config_get_multivar_foreach(cfg, _name, "otherplace", cb, &n));
153 cl_assert_equal_i(n, 1);
154
155 git_config_free(cfg);
156 }
157
158 void test_config_multivar__add_new(void)
159 {
160 const char *var = "a.brand.new";
161 git_config *cfg;
162 int n;
163
164 cl_git_pass(git_config_open_ondisk(&cfg, "config/config11"));
165
166 cl_git_pass(git_config_set_multivar(cfg, var, "$^", "variable"));
167 n = 0;
168 cl_git_pass(git_config_get_multivar_foreach(cfg, var, NULL, cb, &n));
169 cl_assert_equal_i(n, 1);
170
171 git_config_free(cfg);
172 }
173
174 void test_config_multivar__replace(void)
175 {
176 git_config *cfg;
177 int n;
178
179 cl_git_pass(git_config_open_ondisk(&cfg, "config/config11"));
180
181 n = 0;
182 cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n));
183 cl_assert(n == 2);
184
185 cl_git_pass(git_config_set_multivar(cfg, _name, "github", "git://git.otherplace.org/libgit2"));
186
187 n = 0;
188 cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n));
189 cl_assert(n == 2);
190
191 git_config_free(cfg);
192
193 cl_git_pass(git_config_open_ondisk(&cfg, "config/config11"));
194
195 n = 0;
196 cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n));
197 cl_assert(n == 2);
198
199 git_config_free(cfg);
200 }
201
202 void test_config_multivar__replace_multiple(void)
203 {
204 git_config *cfg;
205 int n;
206
207 cl_git_pass(git_config_open_ondisk(&cfg, "config/config11"));
208 cl_git_pass(git_config_set_multivar(cfg, _name, "git://", "git://git.otherplace.org/libgit2"));
209
210 n = 0;
211 cl_git_pass(git_config_get_multivar_foreach(cfg, _name, "otherplace", cb, &n));
212 cl_assert_equal_i(n, 2);
213
214 git_config_free(cfg);
215
216 cl_git_pass(git_config_open_ondisk(&cfg, "config/config11"));
217
218 n = 0;
219 cl_git_pass(git_config_get_multivar_foreach(cfg, _name, "otherplace", cb, &n));
220 cl_assert_equal_i(n, 2);
221
222 git_config_free(cfg);
223 }
224
225 void test_config_multivar__delete(void)
226 {
227 git_config *cfg;
228 int n;
229
230 cl_git_pass(git_config_open_ondisk(&cfg, "config/config11"));
231
232 n = 0;
233 cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n));
234 cl_assert_equal_i(2, n);
235
236 cl_git_pass(git_config_delete_multivar(cfg, _name, "github"));
237
238 n = 0;
239 cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n));
240 cl_assert_equal_i(1, n);
241
242 git_config_free(cfg);
243
244 cl_git_pass(git_config_open_ondisk(&cfg, "config/config11"));
245
246 n = 0;
247 cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n));
248 cl_assert_equal_i(1, n);
249
250 git_config_free(cfg);
251 }
252
253 void test_config_multivar__delete_multiple(void)
254 {
255 git_config *cfg;
256 int n;
257
258 cl_git_pass(git_config_open_ondisk(&cfg, "config/config11"));
259
260 n = 0;
261 cl_git_pass(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n));
262 cl_assert(n == 2);
263
264 cl_git_pass(git_config_delete_multivar(cfg, _name, "git"));
265
266 n = 0;
267 cl_git_fail_with(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n), GIT_ENOTFOUND);
268
269 git_config_free(cfg);
270
271 cl_git_pass(git_config_open_ondisk(&cfg, "config/config11"));
272
273 n = 0;
274 cl_git_fail_with(git_config_get_multivar_foreach(cfg, _name, NULL, cb, &n), GIT_ENOTFOUND);
275
276 git_config_free(cfg);
277 }
278
279 void test_config_multivar__delete_notfound(void)
280 {
281 git_config *cfg;
282
283 cl_git_pass(git_config_open_ondisk(&cfg, "config/config11"));
284
285 cl_git_fail_with(git_config_delete_multivar(cfg, "remote.ab.noturl", "git"), GIT_ENOTFOUND);
286
287 git_config_free(cfg);
288 }