]>
Commit | Line | Data |
---|---|---|
d4b5a4e2 VM |
1 | /* |
2 | * This file is free software; you can redistribute it and/or modify | |
3 | * it under the terms of the GNU General Public License, version 2, | |
4 | * as published by the Free Software Foundation. | |
5 | * | |
6 | * In addition to the permissions in the GNU General Public License, | |
7 | * the authors give you unlimited permission to link the compiled | |
8 | * version of this file into combinations with other programs, | |
9 | * and to distribute those combinations without any restriction | |
10 | * coming from the use of this file. (The General Public License | |
11 | * restrictions do apply in other respects; for example, they cover | |
12 | * modification of the file, and distribution when not linked into | |
13 | * a combined executable.) | |
14 | * | |
15 | * This file is distributed in the hope that it will be useful, but | |
16 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
18 | * General Public License for more details. | |
19 | * | |
20 | * You should have received a copy of the GNU General Public License | |
21 | * along with this program; see the file COPYING. If not, write to | |
22 | * the Free Software Foundation, 51 Franklin Street, Fifth Floor, | |
23 | * Boston, MA 02110-1301, USA. | |
24 | */ | |
25 | #include "test_lib.h" | |
26 | #include "test_helpers.h" | |
27 | ||
28 | #include "odb.h" | |
29 | #include "git2/odb_backend.h" | |
705a90ec | 30 | #include "repository.h" |
d4b5a4e2 VM |
31 | |
32 | typedef struct { | |
33 | git_odb_backend base; | |
34 | int position; | |
35 | } fake_backend; | |
36 | ||
37 | git_odb_backend *new_backend(int position) | |
38 | { | |
39 | fake_backend *b; | |
40 | ||
41 | b = git__malloc(sizeof(fake_backend)); | |
42 | if (b == NULL) | |
43 | return NULL; | |
44 | ||
45 | memset(b, 0x0, sizeof(fake_backend)); | |
46 | b->position = position; | |
47 | return (git_odb_backend *)b; | |
48 | } | |
49 | ||
50 | int test_backend_sorting(git_odb *odb) | |
51 | { | |
52 | unsigned int i; | |
53 | ||
54 | for (i = 0; i < odb->backends.length; ++i) { | |
55 | fake_backend *internal = *((fake_backend **)git_vector_get(&odb->backends, i)); | |
56 | ||
57 | if (internal == NULL) | |
58 | return GIT_ERROR; | |
59 | ||
60 | if (internal->position != (int)i) | |
61 | return GIT_ERROR; | |
62 | } | |
63 | ||
64 | return GIT_SUCCESS; | |
65 | } | |
66 | ||
3dccfed1 | 67 | BEGIN_TEST(odb0, "assure that ODB backends are properly sorted") |
d4b5a4e2 VM |
68 | git_odb *odb; |
69 | must_pass(git_odb_new(&odb)); | |
70 | must_pass(git_odb_add_backend(odb, new_backend(0), 5)); | |
71 | must_pass(git_odb_add_backend(odb, new_backend(2), 3)); | |
72 | must_pass(git_odb_add_backend(odb, new_backend(1), 4)); | |
73 | must_pass(git_odb_add_backend(odb, new_backend(3), 1)); | |
74 | must_pass(test_backend_sorting(odb)); | |
75 | git_odb_close(odb); | |
76 | END_TEST | |
77 | ||
3dccfed1 | 78 | BEGIN_TEST(odb1, "assure that alternate backends are properly sorted") |
d4b5a4e2 VM |
79 | git_odb *odb; |
80 | must_pass(git_odb_new(&odb)); | |
81 | must_pass(git_odb_add_backend(odb, new_backend(0), 5)); | |
82 | must_pass(git_odb_add_backend(odb, new_backend(2), 3)); | |
83 | must_pass(git_odb_add_backend(odb, new_backend(1), 4)); | |
84 | must_pass(git_odb_add_backend(odb, new_backend(3), 1)); | |
85 | must_pass(git_odb_add_alternate(odb, new_backend(4), 5)); | |
86 | must_pass(git_odb_add_alternate(odb, new_backend(6), 3)); | |
87 | must_pass(git_odb_add_alternate(odb, new_backend(5), 4)); | |
88 | must_pass(git_odb_add_alternate(odb, new_backend(7), 1)); | |
89 | must_pass(test_backend_sorting(odb)); | |
90 | git_odb_close(odb); | |
91 | END_TEST | |
92 | ||
705a90ec | 93 | |
94 | #define STANDARD_REPOSITORY 0 | |
95 | #define BARE_REPOSITORY 1 | |
96 | ||
3dccfed1 VM |
97 | static int ensure_repository_init( |
98 | const char *working_directory, | |
99 | int repository_kind, | |
100 | const char *expected_path_index, | |
101 | const char *expected_path_repository, | |
102 | const char *expected_working_directory) | |
705a90ec | 103 | { |
104 | char path_odb[GIT_PATH_MAX]; | |
105 | git_repository *repo; | |
106 | ||
f79026b4 | 107 | if (git_futils_isdir(working_directory) == GIT_SUCCESS) |
3dccfed1 | 108 | return GIT_ERROR; |
705a90ec | 109 | |
f79026b4 | 110 | git_path_join(path_odb, expected_path_repository, GIT_OBJECTS_DIR); |
705a90ec | 111 | |
3dccfed1 VM |
112 | if (git_repository_init(&repo, working_directory, repository_kind) < GIT_SUCCESS) |
113 | return GIT_ERROR; | |
114 | ||
115 | if (repo->path_workdir != NULL || expected_working_directory != NULL) { | |
c90292ce | 116 | if (git__suffixcmp(repo->path_workdir, expected_working_directory) != 0) |
45314a7e | 117 | goto cleanup; |
3dccfed1 VM |
118 | } |
119 | ||
c90292ce | 120 | if (git__suffixcmp(repo->path_odb, path_odb) != 0) |
45314a7e | 121 | goto cleanup; |
3dccfed1 | 122 | |
c90292ce | 123 | if (git__suffixcmp(repo->path_repository, expected_path_repository) != 0) |
45314a7e | 124 | goto cleanup; |
3dccfed1 VM |
125 | |
126 | if (repo->path_index != NULL || expected_path_index != NULL) { | |
c90292ce | 127 | if (git__suffixcmp(repo->path_index, expected_path_index) != 0) |
45314a7e | 128 | goto cleanup; |
fa9bcd81 | 129 | |
6ac91dfe | 130 | #ifdef GIT_WIN32 |
131 | if ((GetFileAttributes(repo->path_repository) & FILE_ATTRIBUTE_HIDDEN) == 0) | |
132 | goto cleanup; | |
133 | #endif | |
134 | ||
fa9bcd81 | 135 | if (git_repository_is_bare(repo) == 1) |
136 | goto cleanup; | |
137 | } else if (git_repository_is_bare(repo) == 0) | |
138 | goto cleanup; | |
139 | ||
140 | if (git_repository_is_empty(repo) == 0) | |
141 | goto cleanup; | |
705a90ec | 142 | |
143 | git_repository_free(repo); | |
858dba58 | 144 | git_futils_rmdir_r(working_directory, 1); |
3dccfed1 VM |
145 | |
146 | return GIT_SUCCESS; | |
45314a7e TC |
147 | |
148 | cleanup: | |
149 | git_repository_free(repo); | |
858dba58 | 150 | git_futils_rmdir_r(working_directory, 1); |
45314a7e | 151 | return GIT_ERROR; |
705a90ec | 152 | } |
153 | ||
3dccfed1 | 154 | BEGIN_TEST(init0, "initialize a standard repo") |
705a90ec | 155 | char path_index[GIT_PATH_MAX], path_repository[GIT_PATH_MAX]; |
156 | ||
f79026b4 VM |
157 | git_path_join(path_repository, TEMP_REPO_FOLDER, GIT_DIR); |
158 | git_path_join(path_index, path_repository, GIT_INDEX_FILE); | |
705a90ec | 159 | |
45314a7e TC |
160 | must_pass(ensure_repository_init(TEMP_REPO_FOLDER, STANDARD_REPOSITORY, path_index, path_repository, TEMP_REPO_FOLDER)); |
161 | must_pass(ensure_repository_init(TEMP_REPO_FOLDER_NS, STANDARD_REPOSITORY, path_index, path_repository, TEMP_REPO_FOLDER)); | |
705a90ec | 162 | END_TEST |
163 | ||
3dccfed1 | 164 | BEGIN_TEST(init1, "initialize a bare repo") |
705a90ec | 165 | char path_repository[GIT_PATH_MAX]; |
166 | ||
f79026b4 | 167 | git_path_join(path_repository, TEMP_REPO_FOLDER, ""); |
705a90ec | 168 | |
45314a7e TC |
169 | must_pass(ensure_repository_init(TEMP_REPO_FOLDER, BARE_REPOSITORY, NULL, path_repository, NULL)); |
170 | must_pass(ensure_repository_init(TEMP_REPO_FOLDER_NS, BARE_REPOSITORY, NULL, path_repository, NULL)); | |
705a90ec | 171 | END_TEST |
172 | ||
ba1bdf86 | 173 | BEGIN_TEST(init2, "Initialize and open a bare repo with a relative path escaping out of the current working directory") |
677a3c07 | 174 | char path_repository[GIT_PATH_MAX]; |
175 | char current_workdir[GIT_PATH_MAX]; | |
176 | const int mode = 0755; /* or 0777 ? */ | |
177 | git_repository* repo; | |
178 | ||
f79026b4 | 179 | must_pass(p_getcwd(current_workdir, sizeof(current_workdir))); |
677a3c07 | 180 | |
f79026b4 VM |
181 | git_path_join(path_repository, TEMP_REPO_FOLDER, "a/b/c/"); |
182 | must_pass(git_futils_mkdir_r(path_repository, mode)); | |
677a3c07 | 183 | |
184 | must_pass(chdir(path_repository)); | |
185 | ||
186 | must_pass(git_repository_init(&repo, "../d/e.git", 1)); | |
c90292ce | 187 | must_pass(git__suffixcmp(repo->path_repository, "/a/b/d/e.git/")); |
188 | ||
677a3c07 | 189 | git_repository_free(repo); |
190 | ||
ba1bdf86 | 191 | must_pass(git_repository_open(&repo, "../d/e.git")); |
192 | ||
193 | git_repository_free(repo); | |
194 | ||
195 | must_pass(chdir(current_workdir)); | |
858dba58 | 196 | must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1)); |
ba1bdf86 | 197 | END_TEST |
198 | ||
d4760a42 | 199 | #define EMPTY_BARE_REPOSITORY_FOLDER TEST_RESOURCES "/empty_bare.git/" |
2ce44b67 | 200 | |
201 | BEGIN_TEST(open0, "Open a bare repository that has just been initialized by git") | |
202 | git_repository *repo; | |
203 | ||
204 | must_pass(copydir_recurs(EMPTY_BARE_REPOSITORY_FOLDER, TEMP_REPO_FOLDER)); | |
205 | must_pass(remove_placeholders(TEMP_REPO_FOLDER, "dummy-marker.txt")); | |
206 | ||
207 | must_pass(git_repository_open(&repo, TEMP_REPO_FOLDER)); | |
602ee38b VM |
208 | must_be_true(git_repository_path(repo, GIT_REPO_PATH) != NULL); |
209 | must_be_true(git_repository_path(repo, GIT_REPO_PATH_WORKDIR) == NULL); | |
2ce44b67 | 210 | |
211 | git_repository_free(repo); | |
858dba58 | 212 | must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1)); |
2ce44b67 | 213 | END_TEST |
214 | ||
d4760a42 | 215 | #define EMPTY_REPOSITORY_FOLDER TEST_RESOURCES "/empty_standard_repo/.gitted/" |
a8375f53 | 216 | |
217 | BEGIN_TEST(open1, "Open a standard repository that has just been initialized by git") | |
218 | git_repository *repo; | |
219 | ||
d4760a42 | 220 | must_pass(copydir_recurs(EMPTY_REPOSITORY_FOLDER, TEST_STD_REPO_FOLDER)); |
221 | must_pass(remove_placeholders(TEST_STD_REPO_FOLDER, "dummy-marker.txt")); | |
a8375f53 | 222 | |
d4760a42 | 223 | must_pass(git_repository_open(&repo, TEST_STD_REPO_FOLDER)); |
602ee38b VM |
224 | must_be_true(git_repository_path(repo, GIT_REPO_PATH) != NULL); |
225 | must_be_true(git_repository_path(repo, GIT_REPO_PATH_WORKDIR) != NULL); | |
a8375f53 | 226 | |
227 | git_repository_free(repo); | |
858dba58 | 228 | must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1)); |
a8375f53 | 229 | END_TEST |
230 | ||
231 | ||
ba1bdf86 | 232 | BEGIN_TEST(open2, "Open a bare repository with a relative path escaping out of the current working directory") |
233 | char new_current_workdir[GIT_PATH_MAX]; | |
234 | char current_workdir[GIT_PATH_MAX]; | |
235 | char path_repository[GIT_PATH_MAX]; | |
236 | ||
237 | const int mode = 0755; /* or 0777 ? */ | |
238 | git_repository* repo; | |
239 | ||
240 | /* Setup the repository to open */ | |
f79026b4 | 241 | must_pass(p_getcwd(current_workdir, sizeof(current_workdir))); |
ba1bdf86 | 242 | strcpy(path_repository, current_workdir); |
f79026b4 | 243 | git_path_join_n(path_repository, 3, path_repository, TEMP_REPO_FOLDER, "a/d/e.git"); |
ba1bdf86 | 244 | must_pass(copydir_recurs(REPOSITORY_FOLDER, path_repository)); |
245 | ||
246 | /* Change the current working directory */ | |
f79026b4 VM |
247 | git_path_join(new_current_workdir, TEMP_REPO_FOLDER, "a/b/c/"); |
248 | must_pass(git_futils_mkdir_r(new_current_workdir, mode)); | |
ba1bdf86 | 249 | must_pass(chdir(new_current_workdir)); |
250 | ||
251 | must_pass(git_repository_open(&repo, "../../d/e.git")); | |
252 | ||
253 | git_repository_free(repo); | |
254 | ||
677a3c07 | 255 | must_pass(chdir(current_workdir)); |
858dba58 | 256 | must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1)); |
677a3c07 | 257 | END_TEST |
d4b5a4e2 | 258 | |
41233c40 VM |
259 | BEGIN_TEST(empty0, "test if a repository is empty or not") |
260 | ||
261 | git_repository *repo_empty, *repo_normal; | |
262 | ||
263 | must_pass(git_repository_open(&repo_normal, REPOSITORY_FOLDER)); | |
264 | must_be_true(git_repository_is_empty(repo_normal) == 0); | |
265 | git_repository_free(repo_normal); | |
266 | ||
267 | must_pass(git_repository_open(&repo_empty, EMPTY_BARE_REPOSITORY_FOLDER)); | |
268 | must_be_true(git_repository_is_empty(repo_empty) == 1); | |
269 | git_repository_free(repo_empty); | |
270 | END_TEST | |
271 | ||
f5e09d60 CMN |
272 | BEGIN_TEST(detached0, "test if HEAD is detached") |
273 | git_repository *repo; | |
274 | git_reference *ref; | |
275 | git_oid oid; | |
276 | ||
277 | must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); | |
278 | ||
c682886e | 279 | must_be_true(git_repository_head_detached(repo) == 0); |
f5e09d60 CMN |
280 | |
281 | /* detach the HEAD */ | |
282 | git_oid_fromstr(&oid, "c47800c7266a2be04c571c04d5a6614691ea99bd"); | |
c682886e VM |
283 | must_pass(git_reference_create_oid(&ref, repo, "HEAD", &oid, 1)); |
284 | must_be_true(git_repository_head_detached(repo) == 1); | |
f5e09d60 CMN |
285 | |
286 | /* take the reop back to it's original state */ | |
c682886e VM |
287 | must_pass(git_reference_create_symbolic(&ref, repo, "HEAD", "refs/heads/master", 1)); |
288 | must_be_true(git_repository_head_detached(repo) == 0); | |
f5e09d60 CMN |
289 | |
290 | git_repository_free(repo); | |
291 | END_TEST | |
292 | ||
293 | BEGIN_TEST(orphan0, "test if HEAD is orphan") | |
294 | git_repository *repo; | |
295 | git_reference *ref; | |
296 | ||
297 | must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); | |
298 | ||
c682886e | 299 | must_be_true(git_repository_head_orphan(repo) == 0); |
f5e09d60 CMN |
300 | |
301 | /* orphan HEAD */ | |
c682886e VM |
302 | must_pass(git_reference_create_symbolic(&ref, repo, "HEAD", "refs/heads/orphan", 1)); |
303 | must_be_true(git_repository_head_orphan(repo) == 1); | |
f5e09d60 CMN |
304 | |
305 | /* take the reop back to it's original state */ | |
c682886e VM |
306 | must_pass(git_reference_create_symbolic(&ref, repo, "HEAD", "refs/heads/master", 1)); |
307 | must_be_true(git_repository_head_orphan(repo) == 0); | |
f5e09d60 CMN |
308 | |
309 | git_repository_free(repo); | |
310 | END_TEST | |
311 | ||
76e9e3b7 RG |
312 | #define DISCOVER_FOLDER TEST_RESOURCES "/discover.git" |
313 | ||
314 | #define SUB_REPOSITORY_FOLDER_NAME "sub_repo" | |
315 | #define SUB_REPOSITORY_FOLDER DISCOVER_FOLDER "/" SUB_REPOSITORY_FOLDER_NAME | |
316 | #define SUB_REPOSITORY_FOLDER_SUB SUB_REPOSITORY_FOLDER "/sub" | |
317 | #define SUB_REPOSITORY_FOLDER_SUB_SUB SUB_REPOSITORY_FOLDER_SUB "/subsub" | |
318 | #define SUB_REPOSITORY_FOLDER_SUB_SUB_SUB SUB_REPOSITORY_FOLDER_SUB_SUB "/subsubsub" | |
319 | ||
320 | #define REPOSITORY_ALTERNATE_FOLDER DISCOVER_FOLDER "/alternate_sub_repo" | |
321 | #define REPOSITORY_ALTERNATE_FOLDER_SUB REPOSITORY_ALTERNATE_FOLDER "/sub" | |
322 | #define REPOSITORY_ALTERNATE_FOLDER_SUB_SUB REPOSITORY_ALTERNATE_FOLDER_SUB "/subsub" | |
323 | #define REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB REPOSITORY_ALTERNATE_FOLDER_SUB_SUB "/subsubsub" | |
324 | ||
325 | #define ALTERNATE_MALFORMED_FOLDER1 DISCOVER_FOLDER "/alternate_malformed_repo1" | |
326 | #define ALTERNATE_MALFORMED_FOLDER2 DISCOVER_FOLDER "/alternate_malformed_repo2" | |
327 | #define ALTERNATE_MALFORMED_FOLDER3 DISCOVER_FOLDER "/alternate_malformed_repo3" | |
328 | #define ALTERNATE_NOT_FOUND_FOLDER DISCOVER_FOLDER "/alternate_not_found_repo" | |
329 | ||
330 | static int ensure_repository_discover(const char *start_path, const char *ceiling_dirs, const char *expected_path) | |
331 | { | |
332 | int error; | |
333 | char found_path[GIT_PATH_MAX]; | |
334 | ||
335 | error = git_repository_discover(found_path, sizeof(found_path), start_path, 0, ceiling_dirs); | |
336 | //across_fs is always 0 as we can't automate the filesystem change tests | |
337 | ||
338 | if (error < GIT_SUCCESS) | |
339 | return error; | |
340 | ||
341 | return strcmp(found_path, expected_path) ? GIT_ERROR : GIT_SUCCESS; | |
342 | } | |
343 | ||
344 | static int write_file(const char *path, const char *content) | |
345 | { | |
346 | int error; | |
347 | git_file file; | |
348 | ||
f79026b4 VM |
349 | if (git_futils_exists(path) == GIT_SUCCESS) { |
350 | error = p_unlink(path); | |
76e9e3b7 RG |
351 | |
352 | if (error < GIT_SUCCESS) | |
353 | return error; | |
354 | } | |
355 | ||
f79026b4 | 356 | file = git_futils_creat_withpath(path, 0644); |
76e9e3b7 RG |
357 | if (file < GIT_SUCCESS) |
358 | return file; | |
359 | ||
84ef7f36 | 360 | error = p_write(file, content, strlen(content) * sizeof(char)); |
76e9e3b7 | 361 | |
f79026b4 | 362 | p_close(file); |
76e9e3b7 RG |
363 | |
364 | return error; | |
365 | } | |
366 | ||
367 | //no check is performed on ceiling_dirs length, so be sure it's long enough | |
368 | static int append_ceiling_dir(char *ceiling_dirs, const char *path) | |
369 | { | |
370 | int len = strlen(ceiling_dirs); | |
371 | int error; | |
372 | ||
eec3fe39 | 373 | error = git_path_prettify_dir(ceiling_dirs + len + (len ? 1 : 0), path, NULL); |
76e9e3b7 RG |
374 | if (error < GIT_SUCCESS) |
375 | return git__rethrow(error, "Failed to append ceiling directory."); | |
376 | ||
377 | if (len) | |
0657e46d | 378 | ceiling_dirs[len] = GIT_PATH_LIST_SEPARATOR; |
76e9e3b7 RG |
379 | |
380 | return GIT_SUCCESS; | |
381 | } | |
382 | ||
383 | BEGIN_TEST(discover0, "test discover") | |
384 | git_repository *repo; | |
385 | char ceiling_dirs[GIT_PATH_MAX * 2] = ""; | |
386 | char repository_path[GIT_PATH_MAX]; | |
387 | char sub_repository_path[GIT_PATH_MAX]; | |
388 | char found_path[GIT_PATH_MAX]; | |
76e9e3b7 RG |
389 | int mode = 0755; |
390 | ||
76e9e3b7 | 391 | must_pass(append_ceiling_dir(ceiling_dirs,TEST_RESOURCES)); |
f79026b4 | 392 | git_futils_mkdir_r(DISCOVER_FOLDER, mode); |
76e9e3b7 | 393 | |
efcc87c9 | 394 | must_be_true(git_repository_discover(repository_path, sizeof(repository_path), DISCOVER_FOLDER, 0, ceiling_dirs) == GIT_ENOTAREPO); |
76e9e3b7 RG |
395 | |
396 | must_pass(git_repository_init(&repo, DISCOVER_FOLDER, 1)); | |
397 | must_pass(git_repository_discover(repository_path, sizeof(repository_path), DISCOVER_FOLDER, 0, ceiling_dirs)); | |
038d2fc3 | 398 | git_repository_free(repo); |
76e9e3b7 RG |
399 | |
400 | must_pass(git_repository_init(&repo, SUB_REPOSITORY_FOLDER, 0)); | |
f79026b4 | 401 | must_pass(git_futils_mkdir_r(SUB_REPOSITORY_FOLDER_SUB_SUB_SUB, mode)); |
76e9e3b7 RG |
402 | must_pass(git_repository_discover(sub_repository_path, sizeof(sub_repository_path), SUB_REPOSITORY_FOLDER, 0, ceiling_dirs)); |
403 | ||
f79026b4 | 404 | must_pass(git_futils_mkdir_r(SUB_REPOSITORY_FOLDER_SUB_SUB_SUB, mode)); |
76e9e3b7 RG |
405 | must_pass(ensure_repository_discover(SUB_REPOSITORY_FOLDER_SUB, ceiling_dirs, sub_repository_path)); |
406 | must_pass(ensure_repository_discover(SUB_REPOSITORY_FOLDER_SUB_SUB, ceiling_dirs, sub_repository_path)); | |
407 | must_pass(ensure_repository_discover(SUB_REPOSITORY_FOLDER_SUB_SUB_SUB, ceiling_dirs, sub_repository_path)); | |
408 | ||
f79026b4 | 409 | must_pass(git_futils_mkdir_r(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB, mode)); |
76e9e3b7 RG |
410 | must_pass(write_file(REPOSITORY_ALTERNATE_FOLDER "/" DOT_GIT, "gitdir: ../" SUB_REPOSITORY_FOLDER_NAME "/" DOT_GIT)); |
411 | must_pass(write_file(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB "/" DOT_GIT, "gitdir: ../../../" SUB_REPOSITORY_FOLDER_NAME "/" DOT_GIT)); | |
412 | must_pass(write_file(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB "/" DOT_GIT, "gitdir: ../../../../")); | |
413 | must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER, ceiling_dirs, sub_repository_path)); | |
414 | must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB, ceiling_dirs, sub_repository_path)); | |
415 | must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB, ceiling_dirs, sub_repository_path)); | |
416 | must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB, ceiling_dirs, repository_path)); | |
417 | ||
f79026b4 | 418 | must_pass(git_futils_mkdir_r(ALTERNATE_MALFORMED_FOLDER1, mode)); |
76e9e3b7 | 419 | must_pass(write_file(ALTERNATE_MALFORMED_FOLDER1 "/" DOT_GIT, "Anything but not gitdir:")); |
f79026b4 | 420 | must_pass(git_futils_mkdir_r(ALTERNATE_MALFORMED_FOLDER2, mode)); |
76e9e3b7 | 421 | must_pass(write_file(ALTERNATE_MALFORMED_FOLDER2 "/" DOT_GIT, "gitdir:")); |
f79026b4 | 422 | must_pass(git_futils_mkdir_r(ALTERNATE_MALFORMED_FOLDER3, mode)); |
76e9e3b7 | 423 | must_pass(write_file(ALTERNATE_MALFORMED_FOLDER3 "/" DOT_GIT, "gitdir: \n\n\n")); |
f79026b4 | 424 | must_pass(git_futils_mkdir_r(ALTERNATE_NOT_FOUND_FOLDER, mode)); |
76e9e3b7 RG |
425 | must_pass(write_file(ALTERNATE_NOT_FOUND_FOLDER "/" DOT_GIT, "gitdir: a_repository_that_surely_does_not_exist")); |
426 | must_fail(git_repository_discover(found_path, sizeof(found_path), ALTERNATE_MALFORMED_FOLDER1, 0, ceiling_dirs)); | |
427 | must_fail(git_repository_discover(found_path, sizeof(found_path), ALTERNATE_MALFORMED_FOLDER2, 0, ceiling_dirs)); | |
428 | must_fail(git_repository_discover(found_path, sizeof(found_path), ALTERNATE_MALFORMED_FOLDER3, 0, ceiling_dirs)); | |
5ad739e8 | 429 | must_fail(git_repository_discover(found_path, sizeof(found_path), ALTERNATE_NOT_FOUND_FOLDER, 0, ceiling_dirs)); |
76e9e3b7 RG |
430 | |
431 | must_pass(append_ceiling_dir(ceiling_dirs, SUB_REPOSITORY_FOLDER)); | |
432 | //this must pass as ceiling_directories cannot predent the current | |
433 | //working directory to be checked | |
434 | must_pass(git_repository_discover(found_path, sizeof(found_path), SUB_REPOSITORY_FOLDER, 0, ceiling_dirs)); | |
5ad739e8 VM |
435 | must_fail(git_repository_discover(found_path, sizeof(found_path), SUB_REPOSITORY_FOLDER_SUB, 0, ceiling_dirs)); |
436 | must_fail(git_repository_discover(found_path, sizeof(found_path), SUB_REPOSITORY_FOLDER_SUB_SUB, 0, ceiling_dirs)); | |
437 | must_fail(git_repository_discover(found_path, sizeof(found_path), SUB_REPOSITORY_FOLDER_SUB_SUB_SUB, 0, ceiling_dirs)); | |
76e9e3b7 RG |
438 | |
439 | //.gitfile redirection should not be affected by ceiling directories | |
440 | must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER, ceiling_dirs, sub_repository_path)); | |
441 | must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB, ceiling_dirs, sub_repository_path)); | |
442 | must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB, ceiling_dirs, sub_repository_path)); | |
443 | must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB, ceiling_dirs, repository_path)); | |
444 | ||
858dba58 | 445 | must_pass(git_futils_rmdir_r(DISCOVER_FOLDER, 1)); |
038d2fc3 | 446 | git_repository_free(repo); |
76e9e3b7 RG |
447 | END_TEST |
448 | ||
3dccfed1 VM |
449 | BEGIN_SUITE(repository) |
450 | ADD_TEST(odb0); | |
451 | ADD_TEST(odb1); | |
452 | ADD_TEST(init0); | |
453 | ADD_TEST(init1); | |
677a3c07 | 454 | ADD_TEST(init2); |
2ce44b67 | 455 | ADD_TEST(open0); |
a8375f53 | 456 | ADD_TEST(open1); |
ba1bdf86 | 457 | ADD_TEST(open2); |
41233c40 | 458 | ADD_TEST(empty0); |
f5e09d60 CMN |
459 | ADD_TEST(detached0); |
460 | ADD_TEST(orphan0); | |
76e9e3b7 | 461 | ADD_TEST(discover0); |
3dccfed1 | 462 | END_SUITE |
d4b5a4e2 | 463 |