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.
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.)
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.
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.
26 #include "test_helpers.h"
29 #include "git2/odb_backend.h"
30 #include "repository.h"
37 git_odb_backend
*new_backend(int position
)
41 b
= git__malloc(sizeof(fake_backend
));
45 memset(b
, 0x0, sizeof(fake_backend
));
46 b
->position
= position
;
47 return (git_odb_backend
*)b
;
50 int test_backend_sorting(git_odb
*odb
)
54 for (i
= 0; i
< odb
->backends
.length
; ++i
) {
55 fake_backend
*internal
= *((fake_backend
**)git_vector_get(&odb
->backends
, i
));
60 if (internal
->position
!= (int)i
)
67 BEGIN_TEST(odb0
, "assure that ODB backends are properly sorted")
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
));
78 BEGIN_TEST(odb1
, "assure that alternate backends are properly sorted")
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
));
94 #define STANDARD_REPOSITORY 0
95 #define BARE_REPOSITORY 1
97 static int ensure_repository_init(
98 const char *working_directory
,
100 const char *expected_path_index
,
101 const char *expected_path_repository
,
102 const char *expected_working_directory
)
104 char path_odb
[GIT_PATH_MAX
];
105 git_repository
*repo
;
107 if (gitfo_isdir(working_directory
) == GIT_SUCCESS
)
110 git__joinpath(path_odb
, expected_path_repository
, GIT_OBJECTS_DIR
);
112 if (git_repository_init(&repo
, working_directory
, repository_kind
) < GIT_SUCCESS
)
115 if (repo
->path_workdir
!= NULL
|| expected_working_directory
!= NULL
) {
116 if (git__suffixcmp(repo
->path_workdir
, expected_working_directory
) != 0)
120 if (git__suffixcmp(repo
->path_odb
, path_odb
) != 0)
123 if (git__suffixcmp(repo
->path_repository
, expected_path_repository
) != 0)
126 if (repo
->path_index
!= NULL
|| expected_path_index
!= NULL
) {
127 if (git__suffixcmp(repo
->path_index
, expected_path_index
) != 0)
131 git_repository_free(repo
);
132 rmdir_recurs(working_directory
);
137 git_repository_free(repo
);
138 rmdir_recurs(working_directory
);
142 BEGIN_TEST(init0
, "initialize a standard repo")
143 char path_index
[GIT_PATH_MAX
], path_repository
[GIT_PATH_MAX
];
145 git__joinpath(path_repository
, TEMP_REPO_FOLDER
, GIT_DIR
);
146 git__joinpath(path_index
, path_repository
, GIT_INDEX_FILE
);
148 must_pass(ensure_repository_init(TEMP_REPO_FOLDER
, STANDARD_REPOSITORY
, path_index
, path_repository
, TEMP_REPO_FOLDER
));
149 must_pass(ensure_repository_init(TEMP_REPO_FOLDER_NS
, STANDARD_REPOSITORY
, path_index
, path_repository
, TEMP_REPO_FOLDER
));
152 BEGIN_TEST(init1
, "initialize a bare repo")
153 char path_repository
[GIT_PATH_MAX
];
155 git__joinpath(path_repository
, TEMP_REPO_FOLDER
, "");
157 must_pass(ensure_repository_init(TEMP_REPO_FOLDER
, BARE_REPOSITORY
, NULL
, path_repository
, NULL
));
158 must_pass(ensure_repository_init(TEMP_REPO_FOLDER_NS
, BARE_REPOSITORY
, NULL
, path_repository
, NULL
));
161 BEGIN_TEST(init2
, "Initialize and open a bare repo with a relative path escaping out of the current working directory")
162 char path_repository
[GIT_PATH_MAX
];
163 char current_workdir
[GIT_PATH_MAX
];
164 const int mode
= 0755; /* or 0777 ? */
165 git_repository
* repo
;
167 must_pass(gitfo_getcwd(current_workdir
, sizeof(current_workdir
)));
169 git__joinpath(path_repository
, TEMP_REPO_FOLDER
, "a/b/c/");
170 must_pass(gitfo_mkdir_recurs(path_repository
, mode
));
172 must_pass(chdir(path_repository
));
174 must_pass(git_repository_init(&repo
, "../d/e.git", 1));
175 must_pass(git__suffixcmp(repo
->path_repository
, "/a/b/d/e.git/"));
177 git_repository_free(repo
);
179 must_pass(git_repository_open(&repo
, "../d/e.git"));
181 git_repository_free(repo
);
183 must_pass(chdir(current_workdir
));
184 rmdir_recurs(TEMP_REPO_FOLDER
);
187 BEGIN_TEST(open2
, "Open a bare repository with a relative path escaping out of the current working directory")
188 char new_current_workdir
[GIT_PATH_MAX
];
189 char current_workdir
[GIT_PATH_MAX
];
190 char path_repository
[GIT_PATH_MAX
];
192 const int mode
= 0755; /* or 0777 ? */
193 git_repository
* repo
;
195 /* Setup the repository to open */
196 must_pass(gitfo_getcwd(current_workdir
, sizeof(current_workdir
)));
197 strcpy(path_repository
, current_workdir
);
198 git__joinpath_n(path_repository
, 3, path_repository
, TEMP_REPO_FOLDER
, "a/d/e.git");
199 must_pass(gitfo_mkdir_recurs(path_repository
, mode
));
200 must_pass(copydir_recurs(REPOSITORY_FOLDER
, path_repository
));
202 /* Change the current working directory */
203 git__joinpath(new_current_workdir
, TEMP_REPO_FOLDER
, "a/b/c/");
204 must_pass(gitfo_mkdir_recurs(new_current_workdir
, mode
));
205 must_pass(chdir(new_current_workdir
));
207 must_pass(git_repository_open(&repo
, "../../d/e.git"));
209 git_repository_free(repo
);
211 must_pass(chdir(current_workdir
));
212 rmdir_recurs(TEMP_REPO_FOLDER
);
215 BEGIN_SUITE(repository
)