]> git.proxmox.com Git - libgit2.git/blob - tests/path/core.c
c875a862ce7b059bfb3ac274687652862967e36c
[libgit2.git] / tests / path / core.c
1 #include "clar_libgit2.h"
2 #include "path.h"
3
4 void test_path_core__cleanup(void)
5 {
6 cl_git_sandbox_cleanup();
7 }
8
9 static void test_make_relative(
10 const char *expected_path,
11 const char *path,
12 const char *parent,
13 int expected_status)
14 {
15 git_buf buf = GIT_BUF_INIT;
16 git_buf_puts(&buf, path);
17 cl_assert_equal_i(expected_status, git_path_make_relative(&buf, parent));
18 cl_assert_equal_s(expected_path, buf.ptr);
19 git_buf_dispose(&buf);
20 }
21
22 void test_path_core__make_relative(void)
23 {
24 test_make_relative("foo.c", "/path/to/foo.c", "/path/to", 0);
25 test_make_relative("bar/foo.c", "/path/to/bar/foo.c", "/path/to", 0);
26 test_make_relative("foo.c", "/path/to/foo.c", "/path/to/", 0);
27
28 test_make_relative("", "/path/to", "/path/to", 0);
29 test_make_relative("", "/path/to", "/path/to/", 0);
30
31 test_make_relative("../", "/path/to", "/path/to/foo", 0);
32
33 test_make_relative("../foo.c", "/path/to/foo.c", "/path/to/bar", 0);
34 test_make_relative("../bar/foo.c", "/path/to/bar/foo.c", "/path/to/baz", 0);
35
36 test_make_relative("../../foo.c", "/path/to/foo.c", "/path/to/foo/bar", 0);
37 test_make_relative("../../foo/bar.c", "/path/to/foo/bar.c", "/path/to/bar/foo", 0);
38
39 test_make_relative("../../foo.c", "/foo.c", "/bar/foo", 0);
40
41 test_make_relative("foo.c", "/path/to/foo.c", "/path/to/", 0);
42 test_make_relative("../foo.c", "/path/to/foo.c", "/path/to/bar/", 0);
43
44 test_make_relative("foo.c", "d:/path/to/foo.c", "d:/path/to", 0);
45
46 test_make_relative("../foo", "/foo", "/bar", 0);
47 test_make_relative("path/to/foo.c", "/path/to/foo.c", "/", 0);
48 test_make_relative("../foo", "path/to/foo", "path/to/bar", 0);
49
50 test_make_relative("/path/to/foo.c", "/path/to/foo.c", "d:/path/to", GIT_ENOTFOUND);
51 test_make_relative("d:/path/to/foo.c", "d:/path/to/foo.c", "/path/to", GIT_ENOTFOUND);
52
53 test_make_relative("/path/to/foo.c", "/path/to/foo.c", "not-a-rooted-path", GIT_ENOTFOUND);
54 test_make_relative("not-a-rooted-path", "not-a-rooted-path", "/path/to", GIT_ENOTFOUND);
55
56 test_make_relative("/path", "/path", "pathtofoo", GIT_ENOTFOUND);
57 test_make_relative("path", "path", "pathtofoo", GIT_ENOTFOUND);
58 }
59
60 void test_path_core__isvalid_standard(void)
61 {
62 cl_assert_equal_b(true, git_path_validate(NULL, "foo/bar", 0, 0));
63 cl_assert_equal_b(true, git_path_validate(NULL, "foo/bar/file.txt", 0, 0));
64 cl_assert_equal_b(true, git_path_validate(NULL, "foo/bar/.file", 0, 0));
65 }
66
67 void test_path_core__isvalid_empty_dir_component(void)
68 {
69 cl_assert_equal_b(false, git_path_validate(NULL, "foo//bar", 0, 0));
70
71 /* leading slash */
72 cl_assert_equal_b(false, git_path_validate(NULL, "/", 0, 0));
73 cl_assert_equal_b(false, git_path_validate(NULL, "/foo", 0, 0));
74 cl_assert_equal_b(false, git_path_validate(NULL, "/foo/bar", 0, 0));
75
76 /* trailing slash */
77 cl_assert_equal_b(false, git_path_validate(NULL, "foo/", 0, 0));
78 cl_assert_equal_b(false, git_path_validate(NULL, "foo/bar/", 0, 0));
79 }
80
81 void test_path_core__isvalid_dot_and_dotdot(void)
82 {
83 cl_assert_equal_b(true, git_path_validate(NULL, ".", 0, 0));
84 cl_assert_equal_b(true, git_path_validate(NULL, "./foo", 0, 0));
85 cl_assert_equal_b(true, git_path_validate(NULL, "foo/.", 0, 0));
86 cl_assert_equal_b(true, git_path_validate(NULL, "./foo", 0, 0));
87
88 cl_assert_equal_b(true, git_path_validate(NULL, "..", 0, 0));
89 cl_assert_equal_b(true, git_path_validate(NULL, "../foo", 0, 0));
90 cl_assert_equal_b(true, git_path_validate(NULL, "foo/..", 0, 0));
91 cl_assert_equal_b(true, git_path_validate(NULL, "../foo", 0, 0));
92
93 cl_assert_equal_b(false, git_path_validate(NULL, ".", 0, GIT_PATH_REJECT_TRAVERSAL));
94 cl_assert_equal_b(false, git_path_validate(NULL, "./foo", 0, GIT_PATH_REJECT_TRAVERSAL));
95 cl_assert_equal_b(false, git_path_validate(NULL, "foo/.", 0, GIT_PATH_REJECT_TRAVERSAL));
96 cl_assert_equal_b(false, git_path_validate(NULL, "./foo", 0, GIT_PATH_REJECT_TRAVERSAL));
97
98 cl_assert_equal_b(false, git_path_validate(NULL, "..", 0, GIT_PATH_REJECT_TRAVERSAL));
99 cl_assert_equal_b(false, git_path_validate(NULL, "../foo", 0, GIT_PATH_REJECT_TRAVERSAL));
100 cl_assert_equal_b(false, git_path_validate(NULL, "foo/..", 0, GIT_PATH_REJECT_TRAVERSAL));
101 cl_assert_equal_b(false, git_path_validate(NULL, "../foo", 0, GIT_PATH_REJECT_TRAVERSAL));
102 }
103
104 void test_path_core__isvalid_dot_git(void)
105 {
106 cl_assert_equal_b(true, git_path_validate(NULL, ".git", 0, 0));
107 cl_assert_equal_b(true, git_path_validate(NULL, ".git/foo", 0, 0));
108 cl_assert_equal_b(true, git_path_validate(NULL, "foo/.git", 0, 0));
109 cl_assert_equal_b(true, git_path_validate(NULL, "foo/.git/bar", 0, 0));
110 cl_assert_equal_b(true, git_path_validate(NULL, "foo/.GIT/bar", 0, 0));
111 cl_assert_equal_b(true, git_path_validate(NULL, "foo/bar/.Git", 0, 0));
112
113 cl_assert_equal_b(false, git_path_validate(NULL, ".git", 0, GIT_PATH_REJECT_DOT_GIT_LITERAL));
114 cl_assert_equal_b(false, git_path_validate(NULL, ".git/foo", 0, GIT_PATH_REJECT_DOT_GIT_LITERAL));
115 cl_assert_equal_b(false, git_path_validate(NULL, "foo/.git", 0, GIT_PATH_REJECT_DOT_GIT_LITERAL));
116 cl_assert_equal_b(false, git_path_validate(NULL, "foo/.git/bar", 0, GIT_PATH_REJECT_DOT_GIT_LITERAL));
117 cl_assert_equal_b(false, git_path_validate(NULL, "foo/.GIT/bar", 0, GIT_PATH_REJECT_DOT_GIT_LITERAL));
118 cl_assert_equal_b(false, git_path_validate(NULL, "foo/bar/.Git", 0, GIT_PATH_REJECT_DOT_GIT_LITERAL));
119
120 cl_assert_equal_b(true, git_path_validate(NULL, "!git", 0, 0));
121 cl_assert_equal_b(true, git_path_validate(NULL, "foo/!git", 0, 0));
122 cl_assert_equal_b(true, git_path_validate(NULL, "!git/bar", 0, 0));
123 cl_assert_equal_b(true, git_path_validate(NULL, ".tig", 0, 0));
124 cl_assert_equal_b(true, git_path_validate(NULL, "foo/.tig", 0, 0));
125 cl_assert_equal_b(true, git_path_validate(NULL, ".tig/bar", 0, 0));
126 }
127
128 void test_path_core__isvalid_backslash(void)
129 {
130 cl_assert_equal_b(true, git_path_validate(NULL, "foo\\file.txt", 0, 0));
131 cl_assert_equal_b(true, git_path_validate(NULL, "foo/bar\\file.txt", 0, 0));
132 cl_assert_equal_b(true, git_path_validate(NULL, "foo/bar\\", 0, 0));
133
134 cl_assert_equal_b(false, git_path_validate(NULL, "foo\\file.txt", 0, GIT_PATH_REJECT_BACKSLASH));
135 cl_assert_equal_b(false, git_path_validate(NULL, "foo/bar\\file.txt", 0, GIT_PATH_REJECT_BACKSLASH));
136 cl_assert_equal_b(false, git_path_validate(NULL, "foo/bar\\", 0, GIT_PATH_REJECT_BACKSLASH));
137 }
138
139 void test_path_core__isvalid_trailing_dot(void)
140 {
141 cl_assert_equal_b(true, git_path_validate(NULL, "foo.", 0, 0));
142 cl_assert_equal_b(true, git_path_validate(NULL, "foo...", 0, 0));
143 cl_assert_equal_b(true, git_path_validate(NULL, "foo/bar.", 0, 0));
144 cl_assert_equal_b(true, git_path_validate(NULL, "foo./bar", 0, 0));
145
146 cl_assert_equal_b(false, git_path_validate(NULL, "foo.", 0, GIT_PATH_REJECT_TRAILING_DOT));
147 cl_assert_equal_b(false, git_path_validate(NULL, "foo...", 0, GIT_PATH_REJECT_TRAILING_DOT));
148 cl_assert_equal_b(false, git_path_validate(NULL, "foo/bar.", 0, GIT_PATH_REJECT_TRAILING_DOT));
149 cl_assert_equal_b(false, git_path_validate(NULL, "foo./bar", 0, GIT_PATH_REJECT_TRAILING_DOT));
150 }
151
152 void test_path_core__isvalid_trailing_space(void)
153 {
154 cl_assert_equal_b(true, git_path_validate(NULL, "foo ", 0, 0));
155 cl_assert_equal_b(true, git_path_validate(NULL, "foo ", 0, 0));
156 cl_assert_equal_b(true, git_path_validate(NULL, "foo/bar ", 0, 0));
157 cl_assert_equal_b(true, git_path_validate(NULL, " ", 0, 0));
158 cl_assert_equal_b(true, git_path_validate(NULL, "foo /bar", 0, 0));
159
160 cl_assert_equal_b(false, git_path_validate(NULL, "foo ", 0, GIT_PATH_REJECT_TRAILING_SPACE));
161 cl_assert_equal_b(false, git_path_validate(NULL, "foo ", 0, GIT_PATH_REJECT_TRAILING_SPACE));
162 cl_assert_equal_b(false, git_path_validate(NULL, "foo/bar ", 0, GIT_PATH_REJECT_TRAILING_SPACE));
163 cl_assert_equal_b(false, git_path_validate(NULL, " ", 0, GIT_PATH_REJECT_TRAILING_SPACE));
164 cl_assert_equal_b(false, git_path_validate(NULL, "foo /bar", 0, GIT_PATH_REJECT_TRAILING_SPACE));
165 }
166
167 void test_path_core__isvalid_trailing_colon(void)
168 {
169 cl_assert_equal_b(true, git_path_validate(NULL, "foo:", 0, 0));
170 cl_assert_equal_b(true, git_path_validate(NULL, "foo/bar:", 0, 0));
171 cl_assert_equal_b(true, git_path_validate(NULL, ":", 0, 0));
172 cl_assert_equal_b(true, git_path_validate(NULL, "foo:/bar", 0, 0));
173
174 cl_assert_equal_b(false, git_path_validate(NULL, "foo:", 0, GIT_PATH_REJECT_TRAILING_COLON));
175 cl_assert_equal_b(false, git_path_validate(NULL, "foo/bar:", 0, GIT_PATH_REJECT_TRAILING_COLON));
176 cl_assert_equal_b(false, git_path_validate(NULL, ":", 0, GIT_PATH_REJECT_TRAILING_COLON));
177 cl_assert_equal_b(false, git_path_validate(NULL, "foo:/bar", 0, GIT_PATH_REJECT_TRAILING_COLON));
178 }
179
180 void test_path_core__isvalid_dotgit_ntfs(void)
181 {
182 cl_assert_equal_b(true, git_path_validate(NULL, ".git", 0, 0));
183 cl_assert_equal_b(true, git_path_validate(NULL, ".git ", 0, 0));
184 cl_assert_equal_b(true, git_path_validate(NULL, ".git.", 0, 0));
185 cl_assert_equal_b(true, git_path_validate(NULL, ".git.. .", 0, 0));
186
187 cl_assert_equal_b(true, git_path_validate(NULL, "git~1", 0, 0));
188 cl_assert_equal_b(true, git_path_validate(NULL, "git~1 ", 0, 0));
189 cl_assert_equal_b(true, git_path_validate(NULL, "git~1.", 0, 0));
190 cl_assert_equal_b(true, git_path_validate(NULL, "git~1.. .", 0, 0));
191
192 cl_assert_equal_b(false, git_path_validate(NULL, ".git", 0, GIT_PATH_REJECT_DOT_GIT_NTFS));
193 cl_assert_equal_b(false, git_path_validate(NULL, ".git ", 0, GIT_PATH_REJECT_DOT_GIT_NTFS));
194 cl_assert_equal_b(false, git_path_validate(NULL, ".git.", 0, GIT_PATH_REJECT_DOT_GIT_NTFS));
195 cl_assert_equal_b(false, git_path_validate(NULL, ".git.. .", 0, GIT_PATH_REJECT_DOT_GIT_NTFS));
196
197 cl_assert_equal_b(false, git_path_validate(NULL, "git~1", 0, GIT_PATH_REJECT_DOT_GIT_NTFS));
198 cl_assert_equal_b(false, git_path_validate(NULL, "git~1 ", 0, GIT_PATH_REJECT_DOT_GIT_NTFS));
199 cl_assert_equal_b(false, git_path_validate(NULL, "git~1.", 0, GIT_PATH_REJECT_DOT_GIT_NTFS));
200 cl_assert_equal_b(false, git_path_validate(NULL, "git~1.. .", 0, GIT_PATH_REJECT_DOT_GIT_NTFS));
201 }
202
203 void test_path_core__isvalid_dos_paths(void)
204 {
205 cl_assert_equal_b(true, git_path_validate(NULL, "aux", 0, 0));
206 cl_assert_equal_b(true, git_path_validate(NULL, "aux.", 0, 0));
207 cl_assert_equal_b(true, git_path_validate(NULL, "aux:", 0, 0));
208 cl_assert_equal_b(true, git_path_validate(NULL, "aux.asdf", 0, 0));
209 cl_assert_equal_b(true, git_path_validate(NULL, "aux.asdf\\zippy", 0, 0));
210 cl_assert_equal_b(true, git_path_validate(NULL, "aux:asdf\\foobar", 0, 0));
211 cl_assert_equal_b(true, git_path_validate(NULL, "con", 0, 0));
212 cl_assert_equal_b(true, git_path_validate(NULL, "prn", 0, 0));
213 cl_assert_equal_b(true, git_path_validate(NULL, "nul", 0, 0));
214
215 cl_assert_equal_b(false, git_path_validate(NULL, "aux", 0, GIT_PATH_REJECT_DOS_PATHS));
216 cl_assert_equal_b(false, git_path_validate(NULL, "aux.", 0, GIT_PATH_REJECT_DOS_PATHS));
217 cl_assert_equal_b(false, git_path_validate(NULL, "aux:", 0, GIT_PATH_REJECT_DOS_PATHS));
218 cl_assert_equal_b(false, git_path_validate(NULL, "aux.asdf", 0, GIT_PATH_REJECT_DOS_PATHS));
219 cl_assert_equal_b(false, git_path_validate(NULL, "aux.asdf\\zippy", 0, GIT_PATH_REJECT_DOS_PATHS));
220 cl_assert_equal_b(false, git_path_validate(NULL, "aux:asdf\\foobar", 0, GIT_PATH_REJECT_DOS_PATHS));
221 cl_assert_equal_b(false, git_path_validate(NULL, "con", 0, GIT_PATH_REJECT_DOS_PATHS));
222 cl_assert_equal_b(false, git_path_validate(NULL, "prn", 0, GIT_PATH_REJECT_DOS_PATHS));
223 cl_assert_equal_b(false, git_path_validate(NULL, "nul", 0, GIT_PATH_REJECT_DOS_PATHS));
224
225 cl_assert_equal_b(true, git_path_validate(NULL, "aux1", 0, 0));
226 cl_assert_equal_b(true, git_path_validate(NULL, "aux1", 0, GIT_PATH_REJECT_DOS_PATHS));
227 cl_assert_equal_b(true, git_path_validate(NULL, "auxn", 0, GIT_PATH_REJECT_DOS_PATHS));
228 cl_assert_equal_b(true, git_path_validate(NULL, "aux\\foo", 0, GIT_PATH_REJECT_DOS_PATHS));
229 }
230
231 void test_path_core__isvalid_dos_paths_withnum(void)
232 {
233 cl_assert_equal_b(true, git_path_validate(NULL, "com1", 0, 0));
234 cl_assert_equal_b(true, git_path_validate(NULL, "com1.", 0, 0));
235 cl_assert_equal_b(true, git_path_validate(NULL, "com1:", 0, 0));
236 cl_assert_equal_b(true, git_path_validate(NULL, "com1.asdf", 0, 0));
237 cl_assert_equal_b(true, git_path_validate(NULL, "com1.asdf\\zippy", 0, 0));
238 cl_assert_equal_b(true, git_path_validate(NULL, "com1:asdf\\foobar", 0, 0));
239 cl_assert_equal_b(true, git_path_validate(NULL, "com1\\foo", 0, 0));
240 cl_assert_equal_b(true, git_path_validate(NULL, "lpt1", 0, 0));
241
242 cl_assert_equal_b(false, git_path_validate(NULL, "com1", 0, GIT_PATH_REJECT_DOS_PATHS));
243 cl_assert_equal_b(false, git_path_validate(NULL, "com1.", 0, GIT_PATH_REJECT_DOS_PATHS));
244 cl_assert_equal_b(false, git_path_validate(NULL, "com1:", 0, GIT_PATH_REJECT_DOS_PATHS));
245 cl_assert_equal_b(false, git_path_validate(NULL, "com1.asdf", 0, GIT_PATH_REJECT_DOS_PATHS));
246 cl_assert_equal_b(false, git_path_validate(NULL, "com1.asdf\\zippy", 0, GIT_PATH_REJECT_DOS_PATHS));
247 cl_assert_equal_b(false, git_path_validate(NULL, "com1:asdf\\foobar", 0, GIT_PATH_REJECT_DOS_PATHS));
248 cl_assert_equal_b(false, git_path_validate(NULL, "com1/foo", 0, GIT_PATH_REJECT_DOS_PATHS));
249 cl_assert_equal_b(false, git_path_validate(NULL, "lpt1", 0, GIT_PATH_REJECT_DOS_PATHS));
250
251 cl_assert_equal_b(true, git_path_validate(NULL, "com0", 0, 0));
252 cl_assert_equal_b(true, git_path_validate(NULL, "com0", 0, GIT_PATH_REJECT_DOS_PATHS));
253 cl_assert_equal_b(true, git_path_validate(NULL, "com10", 0, 0));
254 cl_assert_equal_b(true, git_path_validate(NULL, "com10", 0, GIT_PATH_REJECT_DOS_PATHS));
255 cl_assert_equal_b(true, git_path_validate(NULL, "comn", 0, GIT_PATH_REJECT_DOS_PATHS));
256 cl_assert_equal_b(true, git_path_validate(NULL, "com1\\foo", 0, GIT_PATH_REJECT_DOS_PATHS));
257 cl_assert_equal_b(true, git_path_validate(NULL, "lpt0", 0, GIT_PATH_REJECT_DOS_PATHS));
258 cl_assert_equal_b(true, git_path_validate(NULL, "lpt10", 0, GIT_PATH_REJECT_DOS_PATHS));
259 cl_assert_equal_b(true, git_path_validate(NULL, "lptn", 0, GIT_PATH_REJECT_DOS_PATHS));
260 }
261
262 void test_path_core__isvalid_nt_chars(void)
263 {
264 cl_assert_equal_b(true, git_path_validate(NULL, "asdf\001foo", 0, 0));
265 cl_assert_equal_b(true, git_path_validate(NULL, "asdf\037bar", 0, 0));
266 cl_assert_equal_b(true, git_path_validate(NULL, "asdf<bar", 0, 0));
267 cl_assert_equal_b(true, git_path_validate(NULL, "asdf>foo", 0, 0));
268 cl_assert_equal_b(true, git_path_validate(NULL, "asdf:foo", 0, 0));
269 cl_assert_equal_b(true, git_path_validate(NULL, "asdf\"bar", 0, 0));
270 cl_assert_equal_b(true, git_path_validate(NULL, "asdf|foo", 0, 0));
271 cl_assert_equal_b(true, git_path_validate(NULL, "asdf?bar", 0, 0));
272 cl_assert_equal_b(true, git_path_validate(NULL, "asdf*bar", 0, 0));
273
274 cl_assert_equal_b(false, git_path_validate(NULL, "asdf\001foo", 0, GIT_PATH_REJECT_NT_CHARS));
275 cl_assert_equal_b(false, git_path_validate(NULL, "asdf\037bar", 0, GIT_PATH_REJECT_NT_CHARS));
276 cl_assert_equal_b(false, git_path_validate(NULL, "asdf<bar", 0, GIT_PATH_REJECT_NT_CHARS));
277 cl_assert_equal_b(false, git_path_validate(NULL, "asdf>foo", 0, GIT_PATH_REJECT_NT_CHARS));
278 cl_assert_equal_b(false, git_path_validate(NULL, "asdf:foo", 0, GIT_PATH_REJECT_NT_CHARS));
279 cl_assert_equal_b(false, git_path_validate(NULL, "asdf\"bar", 0, GIT_PATH_REJECT_NT_CHARS));
280 cl_assert_equal_b(false, git_path_validate(NULL, "asdf|foo", 0, GIT_PATH_REJECT_NT_CHARS));
281 cl_assert_equal_b(false, git_path_validate(NULL, "asdf?bar", 0, GIT_PATH_REJECT_NT_CHARS));
282 cl_assert_equal_b(false, git_path_validate(NULL, "asdf*bar", 0, GIT_PATH_REJECT_NT_CHARS));
283 }
284
285 void test_path_core__isvalid_dotgit_with_hfs_ignorables(void)
286 {
287 cl_assert_equal_b(false, git_path_validate(NULL, ".git", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
288 cl_assert_equal_b(false, git_path_validate(NULL, ".git\xe2\x80\x8c", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
289 cl_assert_equal_b(false, git_path_validate(NULL, ".gi\xe2\x80\x8dT", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
290 cl_assert_equal_b(false, git_path_validate(NULL, ".g\xe2\x80\x8eIt", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
291 cl_assert_equal_b(false, git_path_validate(NULL, ".\xe2\x80\x8fgIt", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
292 cl_assert_equal_b(false, git_path_validate(NULL, "\xe2\x80\xaa.gIt", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
293
294 cl_assert_equal_b(false, git_path_validate(NULL, "\xe2\x80\xab.\xe2\x80\xacG\xe2\x80\xadI\xe2\x80\xaet", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
295 cl_assert_equal_b(false, git_path_validate(NULL, "\xe2\x81\xab.\xe2\x80\xaaG\xe2\x81\xabI\xe2\x80\xact", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
296 cl_assert_equal_b(false, git_path_validate(NULL, "\xe2\x81\xad.\xe2\x80\xaeG\xef\xbb\xbfIT", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
297
298 cl_assert_equal_b(true, git_path_validate(NULL, ".", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
299 cl_assert_equal_b(true, git_path_validate(NULL, ".g", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
300 cl_assert_equal_b(true, git_path_validate(NULL, ".gi", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
301 cl_assert_equal_b(true, git_path_validate(NULL, " .git", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
302 cl_assert_equal_b(true, git_path_validate(NULL, "..git\xe2\x80\x8c", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
303 cl_assert_equal_b(true, git_path_validate(NULL, ".gi\xe2\x80\x8dT.", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
304 cl_assert_equal_b(true, git_path_validate(NULL, ".g\xe2\x80It", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
305 cl_assert_equal_b(true, git_path_validate(NULL, ".\xe2gIt", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
306 cl_assert_equal_b(true, git_path_validate(NULL, "\xe2\x80\xaa.gi", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
307 cl_assert_equal_b(true, git_path_validate(NULL, ".gi\x80\x8dT", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
308 cl_assert_equal_b(true, git_path_validate(NULL, ".gi\x8dT", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
309 cl_assert_equal_b(true, git_path_validate(NULL, ".g\xe2i\x80T\x8e", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
310 cl_assert_equal_b(true, git_path_validate(NULL, ".git\xe2\x80\xbf", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
311 cl_assert_equal_b(true, git_path_validate(NULL, ".git\xe2\xab\x81", 0, GIT_PATH_REJECT_DOT_GIT_HFS));
312 }
313
314 void test_path_core__validate_workdir(void)
315 {
316 cl_must_pass(git_path_validate_workdir(NULL, "/foo/bar"));
317 cl_must_pass(git_path_validate_workdir(NULL, "C:\\Foo\\Bar"));
318 cl_must_pass(git_path_validate_workdir(NULL, "\\\\?\\C:\\Foo\\Bar"));
319 cl_must_pass(git_path_validate_workdir(NULL, "\\\\?\\C:\\Foo\\Bar"));
320 cl_must_pass(git_path_validate_workdir(NULL, "\\\\?\\UNC\\server\\C$\\folder"));
321
322 #ifdef GIT_WIN32
323 /*
324 * In the absense of a repo configuration, 259 character paths
325 * succeed. >= 260 character paths fail.
326 */
327 cl_must_pass(git_path_validate_workdir(NULL, "C:\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\ok.txt"));
328 cl_must_pass(git_path_validate_workdir(NULL, "C:\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\260.txt"));
329 cl_must_fail(git_path_validate_workdir(NULL, "C:\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\longer_than_260.txt"));
330
331 /* count characters, not bytes */
332 cl_must_pass(git_path_validate_workdir(NULL, "C:\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\\260.txt"));
333 cl_must_fail(git_path_validate_workdir(NULL, "C:\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\\long.txt"));
334 #else
335 cl_must_pass(git_path_validate_workdir(NULL, "/c/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/ok.txt"));
336 cl_must_pass(git_path_validate_workdir(NULL, "/c/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/260.txt"));
337 cl_must_pass(git_path_validate_workdir(NULL, "/c/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/longer_than_260.txt"));
338 cl_must_pass(git_path_validate_workdir(NULL, "C:\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\\260.txt"));
339 cl_must_pass(git_path_validate_workdir(NULL, "C:\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\aaaaaaaaa\\\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\xc2\xa2\\long.txt"));
340 #endif
341 }
342
343 void test_path_core__validate_workdir_with_core_longpath(void)
344 {
345 #ifdef GIT_WIN32
346 git_repository *repo;
347 git_config *config;
348
349 repo = cl_git_sandbox_init("empty_bare.git");
350
351 cl_git_pass(git_repository_open(&repo, "empty_bare.git"));
352 cl_git_pass(git_repository_config(&config, repo));
353
354 /* fail by default */
355 cl_must_fail(git_path_validate_workdir(repo, "/c/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/longer_than_260.txt"));
356
357 /* set core.longpaths explicitly on */
358 cl_git_pass(git_config_set_bool(config, "core.longpaths", 1));
359 cl_must_pass(git_path_validate_workdir(repo, "/c/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/longer_than_260.txt"));
360
361 /* set core.longpaths explicitly off */
362 cl_git_pass(git_config_set_bool(config, "core.longpaths", 0));
363 cl_must_fail(git_path_validate_workdir(repo, "/c/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/aaaaaaaaa/longer_than_260.txt"));
364
365 git_config_free(config);
366 git_repository_free(repo);
367 #endif
368 }
369
370 static void test_join_unrooted(
371 const char *expected_result,
372 ssize_t expected_rootlen,
373 const char *path,
374 const char *base)
375 {
376 git_buf result = GIT_BUF_INIT;
377 ssize_t root_at;
378
379 cl_git_pass(git_path_join_unrooted(&result, path, base, &root_at));
380 cl_assert_equal_s(expected_result, result.ptr);
381 cl_assert_equal_i(expected_rootlen, root_at);
382
383 git_buf_dispose(&result);
384 }
385
386 void test_path_core__join_unrooted(void)
387 {
388 git_buf out = GIT_BUF_INIT;
389
390 test_join_unrooted("foo", 0, "foo", NULL);
391 test_join_unrooted("foo/bar", 0, "foo/bar", NULL);
392
393 /* Relative paths have base prepended */
394 test_join_unrooted("/foo/bar", 4, "bar", "/foo");
395 test_join_unrooted("/foo/bar/foobar", 4, "bar/foobar", "/foo");
396 test_join_unrooted("c:/foo/bar/foobar", 6, "bar/foobar", "c:/foo");
397 test_join_unrooted("c:/foo/bar/foobar", 10, "foobar", "c:/foo/bar");
398
399 /* Absolute paths are not prepended with base */
400 test_join_unrooted("/foo", 0, "/foo", "/asdf");
401 test_join_unrooted("/foo/bar", 0, "/foo/bar", "/asdf");
402
403 /* Drive letter is given as root length on Windows */
404 test_join_unrooted("c:/foo", 2, "c:/foo", "c:/asdf");
405 test_join_unrooted("c:/foo/bar", 2, "c:/foo/bar", "c:/asdf");
406
407 #ifdef GIT_WIN32
408 /* Paths starting with '\\' are absolute */
409 test_join_unrooted("\\bar", 0, "\\bar", "c:/foo/");
410 test_join_unrooted("\\\\network\\bar", 9, "\\\\network\\bar", "c:/foo/");
411 #else
412 /* Paths starting with '\\' are not absolute on non-Windows systems */
413 test_join_unrooted("/foo/\\bar", 4, "\\bar", "/foo");
414 test_join_unrooted("c:/foo/\\bar", 7, "\\bar", "c:/foo/");
415 #endif
416
417 /* Base is returned when it's provided and is the prefix */
418 test_join_unrooted("c:/foo/bar/foobar", 6, "c:/foo/bar/foobar", "c:/foo");
419 test_join_unrooted("c:/foo/bar/foobar", 10, "c:/foo/bar/foobar", "c:/foo/bar");
420
421 /* Trailing slash in the base is ignored */
422 test_join_unrooted("c:/foo/bar/foobar", 6, "c:/foo/bar/foobar", "c:/foo/");
423
424 git_buf_dispose(&out);
425 }
426
427 void test_path_core__join_unrooted_respects_funny_windows_roots(void)
428 {
429 test_join_unrooted("💩:/foo/bar/foobar", 9, "bar/foobar", "💩:/foo");
430 test_join_unrooted("💩:/foo/bar/foobar", 13, "foobar", "💩:/foo/bar");
431 test_join_unrooted("💩:/foo", 5, "💩:/foo", "💩:/asdf");
432 test_join_unrooted("💩:/foo/bar", 5, "💩:/foo/bar", "💩:/asdf");
433 test_join_unrooted("💩:/foo/bar/foobar", 9, "💩:/foo/bar/foobar", "💩:/foo");
434 test_join_unrooted("💩:/foo/bar/foobar", 13, "💩:/foo/bar/foobar", "💩:/foo/bar");
435 test_join_unrooted("💩:/foo/bar/foobar", 9, "💩:/foo/bar/foobar", "💩:/foo/");
436 }