]>
Commit | Line | Data |
---|---|---|
0ee9f31c ET |
1 | #include "clar_libgit2.h" |
2 | #include "path.h" | |
3 | ||
c25aa7cd PP |
4 | void test_path_core__cleanup(void) |
5 | { | |
6 | cl_git_sandbox_cleanup(); | |
7 | } | |
8 | ||
0ee9f31c ET |
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); | |
ac3d33df | 19 | git_buf_dispose(&buf); |
0ee9f31c ET |
20 | } |
21 | ||
22 | void test_path_core__make_relative(void) | |
23 | { | |
0ee9f31c ET |
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); | |
c25aa7cd | 52 | |
0ee9f31c ET |
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); | |
c25aa7cd | 55 | |
0ee9f31c ET |
56 | test_make_relative("/path", "/path", "pathtofoo", GIT_ENOTFOUND); |
57 | test_make_relative("path", "path", "pathtofoo", GIT_ENOTFOUND); | |
58 | } | |
a64119e3 ET |
59 | |
60 | void test_path_core__isvalid_standard(void) | |
61 | { | |
c25aa7cd PP |
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)); | |
a64119e3 ET |
65 | } |
66 | ||
67 | void test_path_core__isvalid_empty_dir_component(void) | |
68 | { | |
c25aa7cd | 69 | cl_assert_equal_b(false, git_path_validate(NULL, "foo//bar", 0, 0)); |
a64119e3 ET |
70 | |
71 | /* leading slash */ | |
c25aa7cd PP |
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)); | |
a64119e3 ET |
75 | |
76 | /* trailing slash */ | |
c25aa7cd PP |
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)); | |
a64119e3 ET |
79 | } |
80 | ||
81 | void test_path_core__isvalid_dot_and_dotdot(void) | |
82 | { | |
c25aa7cd PP |
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)); | |
a64119e3 ET |
102 | } |
103 | ||
104 | void test_path_core__isvalid_dot_git(void) | |
105 | { | |
c25aa7cd PP |
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)); | |
a64119e3 ET |
126 | } |
127 | ||
128 | void test_path_core__isvalid_backslash(void) | |
129 | { | |
c25aa7cd PP |
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)); | |
a64119e3 | 133 | |
c25aa7cd PP |
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)); | |
a64119e3 ET |
137 | } |
138 | ||
139 | void test_path_core__isvalid_trailing_dot(void) | |
140 | { | |
c25aa7cd PP |
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)); | |
a64119e3 ET |
150 | } |
151 | ||
152 | void test_path_core__isvalid_trailing_space(void) | |
153 | { | |
c25aa7cd PP |
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)); | |
a64119e3 ET |
165 | } |
166 | ||
167 | void test_path_core__isvalid_trailing_colon(void) | |
168 | { | |
c25aa7cd PP |
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)); | |
a64119e3 ET |
178 | } |
179 | ||
ec74b40c | 180 | void test_path_core__isvalid_dotgit_ntfs(void) |
a64119e3 | 181 | { |
c25aa7cd PP |
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)); | |
a64119e3 ET |
201 | } |
202 | ||
203 | void test_path_core__isvalid_dos_paths(void) | |
204 | { | |
c25aa7cd PP |
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)); | |
a64119e3 ET |
229 | } |
230 | ||
231 | void test_path_core__isvalid_dos_paths_withnum(void) | |
232 | { | |
c25aa7cd PP |
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)); | |
a64119e3 ET |
260 | } |
261 | ||
11d67b75 | 262 | void test_path_core__isvalid_nt_chars(void) |
a64119e3 | 263 | { |
c25aa7cd PP |
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)); | |
a64119e3 | 283 | } |
11d67b75 ET |
284 | |
285 | void test_path_core__isvalid_dotgit_with_hfs_ignorables(void) | |
286 | { | |
c25aa7cd PP |
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 | |
11d67b75 | 368 | } |
1fbfcdfc ET |
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 | ||
ac3d33df | 383 | git_buf_dispose(&result); |
1fbfcdfc ET |
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 | ||
22a2d3d5 UG |
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 | ||
1fbfcdfc ET |
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 | ||
ac3d33df | 424 | git_buf_dispose(&out); |
1fbfcdfc | 425 | } |
b6832cbf UG |
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 | } |