]>
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 | ||
d568d585 | 37 | static git_odb_backend *new_backend(int position) |
d4b5a4e2 VM |
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 | ||
d568d585 | 50 | static int test_backend_sorting(git_odb *odb) |
d4b5a4e2 VM |
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 | ||
a8375f53 | 215 | BEGIN_TEST(open1, "Open a standard repository that has just been initialized by git") |
216 | git_repository *repo; | |
217 | ||
d4760a42 | 218 | must_pass(copydir_recurs(EMPTY_REPOSITORY_FOLDER, TEST_STD_REPO_FOLDER)); |
219 | must_pass(remove_placeholders(TEST_STD_REPO_FOLDER, "dummy-marker.txt")); | |
a8375f53 | 220 | |
d4760a42 | 221 | must_pass(git_repository_open(&repo, TEST_STD_REPO_FOLDER)); |
602ee38b VM |
222 | must_be_true(git_repository_path(repo, GIT_REPO_PATH) != NULL); |
223 | must_be_true(git_repository_path(repo, GIT_REPO_PATH_WORKDIR) != NULL); | |
a8375f53 | 224 | |
225 | git_repository_free(repo); | |
858dba58 | 226 | must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1)); |
a8375f53 | 227 | END_TEST |
228 | ||
229 | ||
ba1bdf86 | 230 | BEGIN_TEST(open2, "Open a bare repository with a relative path escaping out of the current working directory") |
231 | char new_current_workdir[GIT_PATH_MAX]; | |
232 | char current_workdir[GIT_PATH_MAX]; | |
233 | char path_repository[GIT_PATH_MAX]; | |
234 | ||
235 | const int mode = 0755; /* or 0777 ? */ | |
236 | git_repository* repo; | |
237 | ||
238 | /* Setup the repository to open */ | |
f79026b4 | 239 | must_pass(p_getcwd(current_workdir, sizeof(current_workdir))); |
ba1bdf86 | 240 | strcpy(path_repository, current_workdir); |
f79026b4 | 241 | git_path_join_n(path_repository, 3, path_repository, TEMP_REPO_FOLDER, "a/d/e.git"); |
ba1bdf86 | 242 | must_pass(copydir_recurs(REPOSITORY_FOLDER, path_repository)); |
243 | ||
244 | /* Change the current working directory */ | |
f79026b4 VM |
245 | git_path_join(new_current_workdir, TEMP_REPO_FOLDER, "a/b/c/"); |
246 | must_pass(git_futils_mkdir_r(new_current_workdir, mode)); | |
ba1bdf86 | 247 | must_pass(chdir(new_current_workdir)); |
248 | ||
249 | must_pass(git_repository_open(&repo, "../../d/e.git")); | |
250 | ||
251 | git_repository_free(repo); | |
252 | ||
677a3c07 | 253 | must_pass(chdir(current_workdir)); |
858dba58 | 254 | must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1)); |
677a3c07 | 255 | END_TEST |
d4b5a4e2 | 256 | |
41233c40 VM |
257 | BEGIN_TEST(empty0, "test if a repository is empty or not") |
258 | ||
259 | git_repository *repo_empty, *repo_normal; | |
260 | ||
261 | must_pass(git_repository_open(&repo_normal, REPOSITORY_FOLDER)); | |
262 | must_be_true(git_repository_is_empty(repo_normal) == 0); | |
263 | git_repository_free(repo_normal); | |
264 | ||
265 | must_pass(git_repository_open(&repo_empty, EMPTY_BARE_REPOSITORY_FOLDER)); | |
266 | must_be_true(git_repository_is_empty(repo_empty) == 1); | |
267 | git_repository_free(repo_empty); | |
268 | END_TEST | |
269 | ||
f5e09d60 CMN |
270 | BEGIN_TEST(detached0, "test if HEAD is detached") |
271 | git_repository *repo; | |
272 | git_reference *ref; | |
273 | git_oid oid; | |
274 | ||
275 | must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); | |
276 | ||
c682886e | 277 | must_be_true(git_repository_head_detached(repo) == 0); |
f5e09d60 CMN |
278 | |
279 | /* detach the HEAD */ | |
280 | git_oid_fromstr(&oid, "c47800c7266a2be04c571c04d5a6614691ea99bd"); | |
c682886e VM |
281 | must_pass(git_reference_create_oid(&ref, repo, "HEAD", &oid, 1)); |
282 | must_be_true(git_repository_head_detached(repo) == 1); | |
f5e09d60 CMN |
283 | |
284 | /* take the reop back to it's original state */ | |
c682886e VM |
285 | must_pass(git_reference_create_symbolic(&ref, repo, "HEAD", "refs/heads/master", 1)); |
286 | must_be_true(git_repository_head_detached(repo) == 0); | |
f5e09d60 CMN |
287 | |
288 | git_repository_free(repo); | |
289 | END_TEST | |
290 | ||
291 | BEGIN_TEST(orphan0, "test if HEAD is orphan") | |
292 | git_repository *repo; | |
293 | git_reference *ref; | |
294 | ||
295 | must_pass(git_repository_open(&repo, REPOSITORY_FOLDER)); | |
296 | ||
c682886e | 297 | must_be_true(git_repository_head_orphan(repo) == 0); |
f5e09d60 CMN |
298 | |
299 | /* orphan HEAD */ | |
c682886e VM |
300 | must_pass(git_reference_create_symbolic(&ref, repo, "HEAD", "refs/heads/orphan", 1)); |
301 | must_be_true(git_repository_head_orphan(repo) == 1); | |
f5e09d60 CMN |
302 | |
303 | /* take the reop back to it's original state */ | |
c682886e VM |
304 | must_pass(git_reference_create_symbolic(&ref, repo, "HEAD", "refs/heads/master", 1)); |
305 | must_be_true(git_repository_head_orphan(repo) == 0); | |
f5e09d60 CMN |
306 | |
307 | git_repository_free(repo); | |
308 | END_TEST | |
309 | ||
ccd122fd | 310 | #define DISCOVER_FOLDER TEMP_REPO_FOLDER "discover.git" |
76e9e3b7 RG |
311 | |
312 | #define SUB_REPOSITORY_FOLDER_NAME "sub_repo" | |
313 | #define SUB_REPOSITORY_FOLDER DISCOVER_FOLDER "/" SUB_REPOSITORY_FOLDER_NAME | |
314 | #define SUB_REPOSITORY_FOLDER_SUB SUB_REPOSITORY_FOLDER "/sub" | |
315 | #define SUB_REPOSITORY_FOLDER_SUB_SUB SUB_REPOSITORY_FOLDER_SUB "/subsub" | |
316 | #define SUB_REPOSITORY_FOLDER_SUB_SUB_SUB SUB_REPOSITORY_FOLDER_SUB_SUB "/subsubsub" | |
317 | ||
318 | #define REPOSITORY_ALTERNATE_FOLDER DISCOVER_FOLDER "/alternate_sub_repo" | |
319 | #define REPOSITORY_ALTERNATE_FOLDER_SUB REPOSITORY_ALTERNATE_FOLDER "/sub" | |
320 | #define REPOSITORY_ALTERNATE_FOLDER_SUB_SUB REPOSITORY_ALTERNATE_FOLDER_SUB "/subsub" | |
321 | #define REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB REPOSITORY_ALTERNATE_FOLDER_SUB_SUB "/subsubsub" | |
322 | ||
323 | #define ALTERNATE_MALFORMED_FOLDER1 DISCOVER_FOLDER "/alternate_malformed_repo1" | |
324 | #define ALTERNATE_MALFORMED_FOLDER2 DISCOVER_FOLDER "/alternate_malformed_repo2" | |
325 | #define ALTERNATE_MALFORMED_FOLDER3 DISCOVER_FOLDER "/alternate_malformed_repo3" | |
326 | #define ALTERNATE_NOT_FOUND_FOLDER DISCOVER_FOLDER "/alternate_not_found_repo" | |
327 | ||
328 | static int ensure_repository_discover(const char *start_path, const char *ceiling_dirs, const char *expected_path) | |
329 | { | |
330 | int error; | |
331 | char found_path[GIT_PATH_MAX]; | |
332 | ||
333 | error = git_repository_discover(found_path, sizeof(found_path), start_path, 0, ceiling_dirs); | |
334 | //across_fs is always 0 as we can't automate the filesystem change tests | |
335 | ||
336 | if (error < GIT_SUCCESS) | |
337 | return error; | |
338 | ||
339 | return strcmp(found_path, expected_path) ? GIT_ERROR : GIT_SUCCESS; | |
340 | } | |
341 | ||
342 | static int write_file(const char *path, const char *content) | |
343 | { | |
344 | int error; | |
345 | git_file file; | |
346 | ||
f79026b4 VM |
347 | if (git_futils_exists(path) == GIT_SUCCESS) { |
348 | error = p_unlink(path); | |
76e9e3b7 RG |
349 | |
350 | if (error < GIT_SUCCESS) | |
351 | return error; | |
352 | } | |
353 | ||
f79026b4 | 354 | file = git_futils_creat_withpath(path, 0644); |
76e9e3b7 RG |
355 | if (file < GIT_SUCCESS) |
356 | return file; | |
357 | ||
84ef7f36 | 358 | error = p_write(file, content, strlen(content) * sizeof(char)); |
76e9e3b7 | 359 | |
f79026b4 | 360 | p_close(file); |
76e9e3b7 RG |
361 | |
362 | return error; | |
363 | } | |
364 | ||
365 | //no check is performed on ceiling_dirs length, so be sure it's long enough | |
366 | static int append_ceiling_dir(char *ceiling_dirs, const char *path) | |
367 | { | |
368 | int len = strlen(ceiling_dirs); | |
369 | int error; | |
370 | ||
eec3fe39 | 371 | error = git_path_prettify_dir(ceiling_dirs + len + (len ? 1 : 0), path, NULL); |
76e9e3b7 RG |
372 | if (error < GIT_SUCCESS) |
373 | return git__rethrow(error, "Failed to append ceiling directory."); | |
374 | ||
375 | if (len) | |
0657e46d | 376 | ceiling_dirs[len] = GIT_PATH_LIST_SEPARATOR; |
76e9e3b7 RG |
377 | |
378 | return GIT_SUCCESS; | |
379 | } | |
380 | ||
381 | BEGIN_TEST(discover0, "test discover") | |
382 | git_repository *repo; | |
383 | char ceiling_dirs[GIT_PATH_MAX * 2] = ""; | |
384 | char repository_path[GIT_PATH_MAX]; | |
385 | char sub_repository_path[GIT_PATH_MAX]; | |
386 | char found_path[GIT_PATH_MAX]; | |
76e9e3b7 RG |
387 | int mode = 0755; |
388 | ||
f79026b4 | 389 | git_futils_mkdir_r(DISCOVER_FOLDER, mode); |
befae28f | 390 | must_pass(append_ceiling_dir(ceiling_dirs, TEMP_REPO_FOLDER)); |
76e9e3b7 | 391 | |
efcc87c9 | 392 | must_be_true(git_repository_discover(repository_path, sizeof(repository_path), DISCOVER_FOLDER, 0, ceiling_dirs) == GIT_ENOTAREPO); |
76e9e3b7 RG |
393 | |
394 | must_pass(git_repository_init(&repo, DISCOVER_FOLDER, 1)); | |
395 | must_pass(git_repository_discover(repository_path, sizeof(repository_path), DISCOVER_FOLDER, 0, ceiling_dirs)); | |
038d2fc3 | 396 | git_repository_free(repo); |
76e9e3b7 RG |
397 | |
398 | must_pass(git_repository_init(&repo, SUB_REPOSITORY_FOLDER, 0)); | |
f79026b4 | 399 | must_pass(git_futils_mkdir_r(SUB_REPOSITORY_FOLDER_SUB_SUB_SUB, mode)); |
76e9e3b7 RG |
400 | must_pass(git_repository_discover(sub_repository_path, sizeof(sub_repository_path), SUB_REPOSITORY_FOLDER, 0, ceiling_dirs)); |
401 | ||
f79026b4 | 402 | must_pass(git_futils_mkdir_r(SUB_REPOSITORY_FOLDER_SUB_SUB_SUB, mode)); |
76e9e3b7 RG |
403 | must_pass(ensure_repository_discover(SUB_REPOSITORY_FOLDER_SUB, ceiling_dirs, sub_repository_path)); |
404 | must_pass(ensure_repository_discover(SUB_REPOSITORY_FOLDER_SUB_SUB, ceiling_dirs, sub_repository_path)); | |
405 | must_pass(ensure_repository_discover(SUB_REPOSITORY_FOLDER_SUB_SUB_SUB, ceiling_dirs, sub_repository_path)); | |
406 | ||
f79026b4 | 407 | must_pass(git_futils_mkdir_r(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB, mode)); |
76e9e3b7 RG |
408 | must_pass(write_file(REPOSITORY_ALTERNATE_FOLDER "/" DOT_GIT, "gitdir: ../" SUB_REPOSITORY_FOLDER_NAME "/" DOT_GIT)); |
409 | must_pass(write_file(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB "/" DOT_GIT, "gitdir: ../../../" SUB_REPOSITORY_FOLDER_NAME "/" DOT_GIT)); | |
410 | must_pass(write_file(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB "/" DOT_GIT, "gitdir: ../../../../")); | |
411 | must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER, ceiling_dirs, sub_repository_path)); | |
412 | must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB, ceiling_dirs, sub_repository_path)); | |
413 | must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB, ceiling_dirs, sub_repository_path)); | |
414 | must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB, ceiling_dirs, repository_path)); | |
415 | ||
f79026b4 | 416 | must_pass(git_futils_mkdir_r(ALTERNATE_MALFORMED_FOLDER1, mode)); |
76e9e3b7 | 417 | must_pass(write_file(ALTERNATE_MALFORMED_FOLDER1 "/" DOT_GIT, "Anything but not gitdir:")); |
f79026b4 | 418 | must_pass(git_futils_mkdir_r(ALTERNATE_MALFORMED_FOLDER2, mode)); |
76e9e3b7 | 419 | must_pass(write_file(ALTERNATE_MALFORMED_FOLDER2 "/" DOT_GIT, "gitdir:")); |
f79026b4 | 420 | must_pass(git_futils_mkdir_r(ALTERNATE_MALFORMED_FOLDER3, mode)); |
76e9e3b7 | 421 | must_pass(write_file(ALTERNATE_MALFORMED_FOLDER3 "/" DOT_GIT, "gitdir: \n\n\n")); |
f79026b4 | 422 | must_pass(git_futils_mkdir_r(ALTERNATE_NOT_FOUND_FOLDER, mode)); |
76e9e3b7 RG |
423 | must_pass(write_file(ALTERNATE_NOT_FOUND_FOLDER "/" DOT_GIT, "gitdir: a_repository_that_surely_does_not_exist")); |
424 | must_fail(git_repository_discover(found_path, sizeof(found_path), ALTERNATE_MALFORMED_FOLDER1, 0, ceiling_dirs)); | |
425 | must_fail(git_repository_discover(found_path, sizeof(found_path), ALTERNATE_MALFORMED_FOLDER2, 0, ceiling_dirs)); | |
426 | must_fail(git_repository_discover(found_path, sizeof(found_path), ALTERNATE_MALFORMED_FOLDER3, 0, ceiling_dirs)); | |
5ad739e8 | 427 | must_fail(git_repository_discover(found_path, sizeof(found_path), ALTERNATE_NOT_FOUND_FOLDER, 0, ceiling_dirs)); |
76e9e3b7 RG |
428 | |
429 | must_pass(append_ceiling_dir(ceiling_dirs, SUB_REPOSITORY_FOLDER)); | |
430 | //this must pass as ceiling_directories cannot predent the current | |
431 | //working directory to be checked | |
432 | must_pass(git_repository_discover(found_path, sizeof(found_path), SUB_REPOSITORY_FOLDER, 0, ceiling_dirs)); | |
5ad739e8 VM |
433 | must_fail(git_repository_discover(found_path, sizeof(found_path), SUB_REPOSITORY_FOLDER_SUB, 0, ceiling_dirs)); |
434 | must_fail(git_repository_discover(found_path, sizeof(found_path), SUB_REPOSITORY_FOLDER_SUB_SUB, 0, ceiling_dirs)); | |
435 | must_fail(git_repository_discover(found_path, sizeof(found_path), SUB_REPOSITORY_FOLDER_SUB_SUB_SUB, 0, ceiling_dirs)); | |
76e9e3b7 RG |
436 | |
437 | //.gitfile redirection should not be affected by ceiling directories | |
438 | must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER, ceiling_dirs, sub_repository_path)); | |
439 | must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB, ceiling_dirs, sub_repository_path)); | |
440 | must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB, ceiling_dirs, sub_repository_path)); | |
441 | must_pass(ensure_repository_discover(REPOSITORY_ALTERNATE_FOLDER_SUB_SUB_SUB, ceiling_dirs, repository_path)); | |
442 | ||
ccd122fd | 443 | must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER, 1)); |
038d2fc3 | 444 | git_repository_free(repo); |
76e9e3b7 RG |
445 | END_TEST |
446 | ||
3dccfed1 VM |
447 | BEGIN_SUITE(repository) |
448 | ADD_TEST(odb0); | |
449 | ADD_TEST(odb1); | |
450 | ADD_TEST(init0); | |
451 | ADD_TEST(init1); | |
677a3c07 | 452 | ADD_TEST(init2); |
2ce44b67 | 453 | ADD_TEST(open0); |
a8375f53 | 454 | ADD_TEST(open1); |
ba1bdf86 | 455 | ADD_TEST(open2); |
41233c40 | 456 | ADD_TEST(empty0); |
f5e09d60 CMN |
457 | ADD_TEST(detached0); |
458 | ADD_TEST(orphan0); | |
76e9e3b7 | 459 | ADD_TEST(discover0); |
3dccfed1 | 460 | END_SUITE |
d4b5a4e2 | 461 |