1 #include "clar_libgit2.h"
4 void test_path_core__cleanup(void)
6 cl_git_sandbox_cleanup();
9 static void test_make_relative(
10 const char *expected_path
,
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
);
22 void test_path_core__make_relative(void)
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);
28 test_make_relative("", "/path/to", "/path/to", 0);
29 test_make_relative("", "/path/to", "/path/to/", 0);
31 test_make_relative("../", "/path/to", "/path/to/foo", 0);
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);
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);
39 test_make_relative("../../foo.c", "/foo.c", "/bar/foo", 0);
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);
44 test_make_relative("foo.c", "d:/path/to/foo.c", "d:/path/to", 0);
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);
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
);
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
);
56 test_make_relative("/path", "/path", "pathtofoo", GIT_ENOTFOUND
);
57 test_make_relative("path", "path", "pathtofoo", GIT_ENOTFOUND
);
60 void test_path_core__isvalid_standard(void)
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));
67 void test_path_core__isvalid_empty_dir_component(void)
69 cl_assert_equal_b(false, git_path_validate(NULL
, "foo//bar", 0, 0));
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));
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));
81 void test_path_core__isvalid_dot_and_dotdot(void)
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));
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));
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
));
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
));
104 void test_path_core__isvalid_dot_git(void)
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));
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
));
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));
128 void test_path_core__isvalid_backslash(void)
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));
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
));
139 void test_path_core__isvalid_trailing_dot(void)
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));
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
));
152 void test_path_core__isvalid_trailing_space(void)
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));
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
));
167 void test_path_core__isvalid_trailing_colon(void)
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));
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
));
180 void test_path_core__isvalid_dotgit_ntfs(void)
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));
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));
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
));
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
));
203 void test_path_core__isvalid_dos_paths(void)
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));
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
));
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
));
231 void test_path_core__isvalid_dos_paths_withnum(void)
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));
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
));
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
));
262 void test_path_core__isvalid_nt_chars(void)
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));
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
));
285 void test_path_core__isvalid_dotgit_with_hfs_ignorables(void)
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
));
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
));
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
));
314 void test_path_core__validate_workdir(void)
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"));
324 * In the absense of a repo configuration, 259 character paths
325 * succeed. >= 260 character paths fail.
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"));
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"));
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"));
343 void test_path_core__validate_workdir_with_core_longpath(void)
346 git_repository
*repo
;
349 repo
= cl_git_sandbox_init("empty_bare.git");
351 cl_git_pass(git_repository_open(&repo
, "empty_bare.git"));
352 cl_git_pass(git_repository_config(&config
, repo
));
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"));
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"));
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"));
365 git_config_free(config
);
366 git_repository_free(repo
);
370 static void test_join_unrooted(
371 const char *expected_result
,
372 ssize_t expected_rootlen
,
376 git_buf result
= GIT_BUF_INIT
;
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
);
383 git_buf_dispose(&result
);
386 void test_path_core__join_unrooted(void)
388 git_buf out
= GIT_BUF_INIT
;
390 test_join_unrooted("foo", 0, "foo", NULL
);
391 test_join_unrooted("foo/bar", 0, "foo/bar", NULL
);
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");
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");
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");
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/");
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/");
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");
421 /* Trailing slash in the base is ignored */
422 test_join_unrooted("c:/foo/bar/foobar", 6, "c:/foo/bar/foobar", "c:/foo/");
424 git_buf_dispose(&out
);
427 void test_path_core__join_unrooted_respects_funny_windows_roots(void)
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/");