]> git.proxmox.com Git - libgit2.git/blob - tests/refs/normalize.c
New upstream version 1.1.0+dfsg.1
[libgit2.git] / tests / refs / normalize.c
1 #include "clar_libgit2.h"
2
3 #include "repository.h"
4 #include "git2/reflog.h"
5 #include "reflog.h"
6
7 /* Helpers */
8 static void ensure_refname_normalized(
9 unsigned int flags,
10 const char *input_refname,
11 const char *expected_refname)
12 {
13 char buffer_out[GIT_REFNAME_MAX];
14
15 cl_git_pass(git_reference_normalize_name(buffer_out, sizeof(buffer_out), input_refname, flags));
16
17 cl_assert_equal_s(expected_refname, buffer_out);
18 }
19
20 static void ensure_refname_invalid(unsigned int flags, const char *input_refname)
21 {
22 char buffer_out[GIT_REFNAME_MAX];
23
24 cl_assert_equal_i(
25 GIT_EINVALIDSPEC,
26 git_reference_normalize_name(buffer_out, sizeof(buffer_out), input_refname, flags));
27 }
28
29 void test_refs_normalize__can_normalize_a_direct_reference_name(void)
30 {
31 ensure_refname_normalized(
32 GIT_REFERENCE_FORMAT_NORMAL, "refs/dummy/a", "refs/dummy/a");
33 ensure_refname_normalized(
34 GIT_REFERENCE_FORMAT_NORMAL, "refs/stash", "refs/stash");
35 ensure_refname_normalized(
36 GIT_REFERENCE_FORMAT_NORMAL, "refs/tags/a", "refs/tags/a");
37 ensure_refname_normalized(
38 GIT_REFERENCE_FORMAT_NORMAL, "refs/heads/a/b", "refs/heads/a/b");
39 ensure_refname_normalized(
40 GIT_REFERENCE_FORMAT_NORMAL, "refs/heads/a./b", "refs/heads/a./b");
41 ensure_refname_normalized(
42 GIT_REFERENCE_FORMAT_NORMAL, "refs/heads/v@ation", "refs/heads/v@ation");
43 ensure_refname_normalized(
44 GIT_REFERENCE_FORMAT_NORMAL, "refs///heads///a", "refs/heads/a");
45 }
46
47 void test_refs_normalize__cannot_normalize_any_direct_reference_name(void)
48 {
49 ensure_refname_invalid(
50 GIT_REFERENCE_FORMAT_NORMAL, "a");
51 ensure_refname_invalid(
52 GIT_REFERENCE_FORMAT_NORMAL, "/a");
53 ensure_refname_invalid(
54 GIT_REFERENCE_FORMAT_NORMAL, "//a");
55 ensure_refname_invalid(
56 GIT_REFERENCE_FORMAT_NORMAL, "");
57 ensure_refname_invalid(
58 GIT_REFERENCE_FORMAT_NORMAL, "/refs/heads/a/");
59 ensure_refname_invalid(
60 GIT_REFERENCE_FORMAT_NORMAL, "refs/heads/a/");
61 ensure_refname_invalid(
62 GIT_REFERENCE_FORMAT_NORMAL, "refs/heads/a.");
63 ensure_refname_invalid(
64 GIT_REFERENCE_FORMAT_NORMAL, "refs/heads/a.lock");
65 ensure_refname_invalid(
66 GIT_REFERENCE_FORMAT_NORMAL, "refs/heads/foo?bar");
67 ensure_refname_invalid(
68 GIT_REFERENCE_FORMAT_NORMAL, "refs/heads\foo");
69 ensure_refname_normalized(
70 GIT_REFERENCE_FORMAT_NORMAL, "refs/heads/v@ation", "refs/heads/v@ation");
71 ensure_refname_normalized(
72 GIT_REFERENCE_FORMAT_NORMAL, "refs///heads///a", "refs/heads/a");
73 ensure_refname_invalid(
74 GIT_REFERENCE_FORMAT_NORMAL, "refs/heads/.a/b");
75 ensure_refname_invalid(
76 GIT_REFERENCE_FORMAT_NORMAL, "refs/heads/foo/../bar");
77 ensure_refname_invalid(
78 GIT_REFERENCE_FORMAT_NORMAL, "refs/heads/foo..bar");
79 ensure_refname_invalid(
80 GIT_REFERENCE_FORMAT_NORMAL, "refs/heads/./foo");
81 ensure_refname_invalid(
82 GIT_REFERENCE_FORMAT_NORMAL, "refs/heads/v@{ation");
83 }
84
85 void test_refs_normalize__symbolic(void)
86 {
87 ensure_refname_invalid(
88 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "");
89 ensure_refname_invalid(
90 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "heads\foo");
91 ensure_refname_invalid(
92 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "/");
93 ensure_refname_invalid(
94 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "///");
95
96 ensure_refname_normalized(
97 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "ALL_CAPS_AND_UNDERSCORES", "ALL_CAPS_AND_UNDERSCORES");
98 ensure_refname_normalized(
99 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/MixedCasing", "refs/MixedCasing");
100 ensure_refname_normalized(
101 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs///heads///a", "refs/heads/a");
102
103 ensure_refname_normalized(
104 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "HEAD", "HEAD");
105 ensure_refname_normalized(
106 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "MERGE_HEAD", "MERGE_HEAD");
107 ensure_refname_normalized(
108 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "FETCH_HEAD", "FETCH_HEAD");
109 }
110
111 /* Ported from JGit, BSD licence.
112 * See https://github.com/spearce/JGit/commit/e4bf8f6957bbb29362575d641d1e77a02d906739
113 *
114 * Copyright (C) 2009, Google Inc.
115 *
116 * All rights reserved.
117 *
118 * Redistribution and use in source and binary forms, with or
119 * without modification, are permitted provided that the following
120 * conditions are met:
121 *
122 * - Redistributions of source code must retain the above copyright
123 * notice, this list of conditions and the following disclaimer.
124 *
125 * - Redistributions in binary form must reproduce the above
126 * copyright notice, this list of conditions and the following
127 * disclaimer in the documentation and/or other materials provided
128 * with the distribution.
129 *
130 * - Neither the name of the Git Development Community nor the
131 * names of its contributors may be used to endorse or promote
132 * products derived from this software without specific prior
133 * written permission.
134 *
135 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
136 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
137 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
138 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
139 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
140 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
141 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
142 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
143 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
144 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
145 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
146 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
147 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
148 */
149
150 void test_refs_normalize__jgit_suite(void)
151 {
152 /* tests borrowed from JGit */
153
154 /* EmptyString */
155 ensure_refname_invalid(
156 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "");
157 ensure_refname_invalid(
158 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "/");
159
160 /* MustHaveTwoComponents */
161 ensure_refname_invalid(
162 GIT_REFERENCE_FORMAT_NORMAL, "master");
163 ensure_refname_normalized(
164 GIT_REFERENCE_FORMAT_NORMAL, "heads/master", "heads/master");
165
166 /* ValidHead */
167 ensure_refname_normalized(
168 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/master", "refs/heads/master");
169 ensure_refname_normalized(
170 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/pu", "refs/heads/pu");
171 ensure_refname_normalized(
172 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/z", "refs/heads/z");
173 ensure_refname_normalized(
174 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/FoO", "refs/heads/FoO");
175
176 /* ValidTag */
177 ensure_refname_normalized(
178 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/tags/v1.0", "refs/tags/v1.0");
179
180 /* NoLockSuffix */
181 ensure_refname_invalid(GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/master.lock");
182
183 /* NoDirectorySuffix */
184 ensure_refname_invalid(
185 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/master/");
186
187 /* NoSpace */
188 ensure_refname_invalid(
189 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/i haz space");
190
191 /* NoAsciiControlCharacters */
192 {
193 char c;
194 char buffer[GIT_REFNAME_MAX];
195 for (c = '\1'; c < ' '; c++) {
196 p_snprintf(buffer, sizeof(buffer), "refs/heads/mast%cer", c);
197 ensure_refname_invalid(GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, buffer);
198 }
199 }
200
201 /* NoBareDot */
202 ensure_refname_invalid(
203 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/.");
204 ensure_refname_invalid(
205 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/..");
206 ensure_refname_invalid(
207 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/./master");
208 ensure_refname_invalid(
209 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/../master");
210
211 /* NoLeadingOrTrailingDot */
212 ensure_refname_invalid(
213 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, ".");
214 ensure_refname_invalid(
215 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/.bar");
216 ensure_refname_invalid(
217 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/..bar");
218 ensure_refname_invalid(
219 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/bar.");
220
221 /* ContainsDot */
222 ensure_refname_normalized(
223 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/m.a.s.t.e.r", "refs/heads/m.a.s.t.e.r");
224 ensure_refname_invalid(
225 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/master..pu");
226
227 /* NoMagicRefCharacters */
228 ensure_refname_invalid(
229 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/master^");
230 ensure_refname_invalid(
231 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/^master");
232 ensure_refname_invalid(
233 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "^refs/heads/master");
234
235 ensure_refname_invalid(
236 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/master~");
237 ensure_refname_invalid(
238 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/~master");
239 ensure_refname_invalid(
240 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "~refs/heads/master");
241
242 ensure_refname_invalid(
243 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/master:");
244 ensure_refname_invalid(
245 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/:master");
246 ensure_refname_invalid(
247 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, ":refs/heads/master");
248
249 /* ShellGlob */
250 ensure_refname_invalid(
251 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/master?");
252 ensure_refname_invalid(
253 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/?master");
254 ensure_refname_invalid(
255 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "?refs/heads/master");
256
257 ensure_refname_invalid(
258 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/master[");
259 ensure_refname_invalid(
260 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/[master");
261 ensure_refname_invalid(
262 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "[refs/heads/master");
263
264 ensure_refname_invalid(
265 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/master*");
266 ensure_refname_invalid(
267 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/*master");
268 ensure_refname_invalid(
269 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "*refs/heads/master");
270
271 /* ValidSpecialCharacters */
272 ensure_refname_normalized
273 (GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/!", "refs/heads/!");
274 ensure_refname_normalized(
275 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/\"", "refs/heads/\"");
276 ensure_refname_normalized(
277 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/#", "refs/heads/#");
278 ensure_refname_normalized(
279 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/$", "refs/heads/$");
280 ensure_refname_normalized(
281 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/%", "refs/heads/%");
282 ensure_refname_normalized(
283 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/&", "refs/heads/&");
284 ensure_refname_normalized(
285 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/'", "refs/heads/'");
286 ensure_refname_normalized(
287 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/(", "refs/heads/(");
288 ensure_refname_normalized(
289 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/)", "refs/heads/)");
290 ensure_refname_normalized(
291 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/+", "refs/heads/+");
292 ensure_refname_normalized(
293 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/,", "refs/heads/,");
294 ensure_refname_normalized(
295 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/-", "refs/heads/-");
296 ensure_refname_normalized(
297 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/;", "refs/heads/;");
298 ensure_refname_normalized(
299 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/<", "refs/heads/<");
300 ensure_refname_normalized(
301 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/=", "refs/heads/=");
302 ensure_refname_normalized(
303 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/>", "refs/heads/>");
304 ensure_refname_normalized(
305 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/@", "refs/heads/@");
306 ensure_refname_normalized(
307 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/]", "refs/heads/]");
308 ensure_refname_normalized(
309 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/_", "refs/heads/_");
310 ensure_refname_normalized(
311 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/`", "refs/heads/`");
312 ensure_refname_normalized(
313 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/{", "refs/heads/{");
314 ensure_refname_normalized(
315 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/|", "refs/heads/|");
316 ensure_refname_normalized(
317 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/}", "refs/heads/}");
318
319 /*
320 * This is valid on UNIX, but not on Windows
321 * hence we make in invalid due to non-portability
322 */
323 ensure_refname_invalid(
324 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/\\");
325
326 /* UnicodeNames */
327 /*
328 * Currently this fails.
329 * ensure_refname_normalized(GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/\u00e5ngstr\u00f6m", "refs/heads/\u00e5ngstr\u00f6m");
330 */
331
332 /* RefLogQueryIsValidRef */
333 ensure_refname_invalid(
334 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/master@{1}");
335 ensure_refname_invalid(
336 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL, "refs/heads/master@{1.hour.ago}");
337 }
338
339 void test_refs_normalize__buffer_has_to_be_big_enough_to_hold_the_normalized_version(void)
340 {
341 char buffer_out[21];
342
343 cl_git_pass(git_reference_normalize_name(
344 buffer_out, 21, "refs//heads///long///name", GIT_REFERENCE_FORMAT_NORMAL));
345 cl_git_fail(git_reference_normalize_name(
346 buffer_out, 20, "refs//heads///long///name", GIT_REFERENCE_FORMAT_NORMAL));
347 }
348
349 #define ONE_LEVEL_AND_REFSPEC \
350 GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL \
351 | GIT_REFERENCE_FORMAT_REFSPEC_PATTERN
352
353 void test_refs_normalize__refspec_pattern(void)
354 {
355 ensure_refname_normalized(
356 GIT_REFERENCE_FORMAT_REFSPEC_PATTERN, "heads/*foo/bar", "heads/*foo/bar");
357 ensure_refname_normalized(
358 GIT_REFERENCE_FORMAT_REFSPEC_PATTERN, "heads/foo*/bar", "heads/foo*/bar");
359 ensure_refname_normalized(
360 GIT_REFERENCE_FORMAT_REFSPEC_PATTERN, "heads/f*o/bar", "heads/f*o/bar");
361
362 ensure_refname_invalid(
363 GIT_REFERENCE_FORMAT_REFSPEC_PATTERN, "foo");
364 ensure_refname_normalized(
365 ONE_LEVEL_AND_REFSPEC, "FOO", "FOO");
366
367 ensure_refname_normalized(
368 GIT_REFERENCE_FORMAT_REFSPEC_PATTERN, "foo/bar", "foo/bar");
369 ensure_refname_normalized(
370 ONE_LEVEL_AND_REFSPEC, "foo/bar", "foo/bar");
371
372 ensure_refname_normalized(
373 GIT_REFERENCE_FORMAT_REFSPEC_PATTERN, "*/foo", "*/foo");
374 ensure_refname_normalized(
375 ONE_LEVEL_AND_REFSPEC, "*/foo", "*/foo");
376
377 ensure_refname_normalized(
378 GIT_REFERENCE_FORMAT_REFSPEC_PATTERN, "foo/*/bar", "foo/*/bar");
379 ensure_refname_normalized(
380 ONE_LEVEL_AND_REFSPEC, "foo/*/bar", "foo/*/bar");
381
382 ensure_refname_invalid(
383 GIT_REFERENCE_FORMAT_REFSPEC_PATTERN, "*");
384 ensure_refname_normalized(
385 ONE_LEVEL_AND_REFSPEC, "*", "*");
386
387 ensure_refname_invalid(
388 GIT_REFERENCE_FORMAT_REFSPEC_PATTERN, "foo/*/*");
389 ensure_refname_invalid(
390 ONE_LEVEL_AND_REFSPEC, "foo/*/*");
391
392 ensure_refname_invalid(
393 GIT_REFERENCE_FORMAT_REFSPEC_PATTERN, "*/foo/*");
394 ensure_refname_invalid(
395 ONE_LEVEL_AND_REFSPEC, "*/foo/*");
396
397 ensure_refname_invalid(
398 GIT_REFERENCE_FORMAT_REFSPEC_PATTERN, "*/*/foo");
399 ensure_refname_invalid(
400 ONE_LEVEL_AND_REFSPEC, "*/*/foo");
401 }