1 #include "clar_libgit2.h"
6 #include "submodule_helpers.h"
7 #include "git2/sys/repository.h"
9 /* rewrite gitmodules -> .gitmodules
10 * rewrite the empty or relative urls inside each module
11 * rename the .gitted directory inside any submodule to .git
13 void rewrite_gitmodules(const char *workdir
)
15 git_buf in_f
= GIT_BUF_INIT
, out_f
= GIT_BUF_INIT
, path
= GIT_BUF_INIT
;
19 cl_git_pass(git_buf_joinpath(&in_f
, workdir
, "gitmodules"));
20 cl_git_pass(git_buf_joinpath(&out_f
, workdir
, ".gitmodules"));
22 cl_assert((in
= fopen(in_f
.ptr
, "rb")) != NULL
);
23 cl_assert((out
= fopen(out_f
.ptr
, "wb")) != NULL
);
25 while (fgets(line
, sizeof(line
), in
) != NULL
) {
28 while (*scan
== ' ' || *scan
== '\t') scan
++;
30 /* rename .gitted -> .git in submodule directories */
31 if (git__prefixcmp(scan
, "path =") == 0) {
32 scan
+= strlen("path =");
33 while (*scan
== ' ') scan
++;
35 git_buf_joinpath(&path
, workdir
, scan
);
37 git_buf_joinpath(&path
, path
.ptr
, ".gitted");
39 if (!git_buf_oom(&path
) && p_access(path
.ptr
, F_OK
) == 0) {
40 git_buf_joinpath(&out_f
, workdir
, scan
);
41 git_buf_rtrim(&out_f
);
42 git_buf_joinpath(&out_f
, out_f
.ptr
, ".git");
44 if (!git_buf_oom(&out_f
))
45 p_rename(path
.ptr
, out_f
.ptr
);
49 /* copy non-"url =" lines verbatim */
50 if (git__prefixcmp(scan
, "url =") != 0) {
55 /* convert relative URLs in "url =" lines */
56 scan
+= strlen("url =");
57 while (*scan
== ' ') scan
++;
60 git_buf_joinpath(&path
, workdir
, scan
);
62 } else if (!*scan
|| *scan
== '\n') {
63 git_buf_joinpath(&path
, workdir
, "../testrepo.git");
69 git_path_prettify(&path
, path
.ptr
, NULL
);
70 git_buf_putc(&path
, '\n');
71 cl_assert(!git_buf_oom(&path
));
73 fwrite(line
, scan
- line
, sizeof(char), out
);
80 cl_must_pass(p_unlink(in_f
.ptr
));
87 static void cleanup_fixture_submodules(void *payload
)
89 cl_git_sandbox_cleanup(); /* either "submodules" or "submod2" */
92 cl_fixture_cleanup(payload
);
95 git_repository
*setup_fixture_submodules(void)
97 git_repository
*repo
= cl_git_sandbox_init("submodules");
99 cl_fixture_sandbox("testrepo.git");
101 rewrite_gitmodules(git_repository_workdir(repo
));
102 p_rename("submodules/testrepo/.gitted", "submodules/testrepo/.git");
104 cl_set_cleanup(cleanup_fixture_submodules
, "testrepo.git");
106 cl_git_pass(git_repository_reinit_filesystem(repo
, 1));
111 git_repository
*setup_fixture_submod2(void)
113 git_repository
*repo
= cl_git_sandbox_init("submod2");
115 cl_fixture_sandbox("submod2_target");
116 p_rename("submod2_target/.gitted", "submod2_target/.git");
118 rewrite_gitmodules(git_repository_workdir(repo
));
119 p_rename("submod2/not-submodule/.gitted", "submod2/not-submodule/.git");
120 p_rename("submod2/not/.gitted", "submod2/not/.git");
122 cl_set_cleanup(cleanup_fixture_submodules
, "submod2_target");
124 cl_git_pass(git_repository_reinit_filesystem(repo
, 1));
129 git_repository
*setup_fixture_submod3(void)
131 git_repository
*repo
= cl_git_sandbox_init("submod3");
133 cl_fixture_sandbox("submod2_target");
134 p_rename("submod2_target/.gitted", "submod2_target/.git");
136 rewrite_gitmodules(git_repository_workdir(repo
));
137 p_rename("submod3/One/.gitted", "submod3/One/.git");
138 p_rename("submod3/TWO/.gitted", "submod3/TWO/.git");
139 p_rename("submod3/three/.gitted", "submod3/three/.git");
140 p_rename("submod3/FoUr/.gitted", "submod3/FoUr/.git");
141 p_rename("submod3/Five/.gitted", "submod3/Five/.git");
142 p_rename("submod3/six/.gitted", "submod3/six/.git");
143 p_rename("submod3/sEvEn/.gitted", "submod3/sEvEn/.git");
144 p_rename("submod3/EIGHT/.gitted", "submod3/EIGHT/.git");
145 p_rename("submod3/nine/.gitted", "submod3/nine/.git");
146 p_rename("submod3/TEN/.gitted", "submod3/TEN/.git");
148 cl_set_cleanup(cleanup_fixture_submodules
, "submod2_target");
150 cl_git_pass(git_repository_reinit_filesystem(repo
, 1));
155 git_repository
*setup_fixture_super(void)
157 git_repository
*repo
= cl_git_sandbox_init("super");
159 cl_fixture_sandbox("sub.git");
160 p_mkdir("super/sub", 0777);
162 rewrite_gitmodules(git_repository_workdir(repo
));
164 cl_set_cleanup(cleanup_fixture_submodules
, "sub.git");
166 cl_git_pass(git_repository_reinit_filesystem(repo
, 1));
171 git_repository
*setup_fixture_submodule_simple(void)
173 git_repository
*repo
= cl_git_sandbox_init("submodule_simple");
175 cl_fixture_sandbox("testrepo.git");
176 p_mkdir("submodule_simple/testrepo", 0777);
178 cl_set_cleanup(cleanup_fixture_submodules
, "testrepo.git");
180 cl_git_pass(git_repository_reinit_filesystem(repo
, 1));
185 git_repository
*setup_fixture_submodule_with_path(void)
187 git_repository
*repo
= cl_git_sandbox_init("submodule_with_path");
189 cl_fixture_sandbox("testrepo.git");
190 p_mkdir("submodule_with_path/lib", 0777);
191 p_mkdir("submodule_with_path/lib/testrepo", 0777);
193 cl_set_cleanup(cleanup_fixture_submodules
, "testrepo.git");
195 cl_git_pass(git_repository_reinit_filesystem(repo
, 1));
200 void assert__submodule_exists(
201 git_repository
*repo
, const char *name
,
202 const char *msg
, const char *file
, int line
)
205 int error
= git_submodule_lookup(&sm
, repo
, name
);
207 cl_git_report_failure(error
, 0, file
, line
, msg
);
208 cl_assert_at_line(sm
!= NULL
, file
, line
);
209 git_submodule_free(sm
);
212 void refute__submodule_exists(
213 git_repository
*repo
, const char *name
, int expected_error
,
214 const char *msg
, const char *file
, int line
)
217 file
, line
, msg
, 1, "%i",
218 expected_error
, (int)(git_submodule_lookup(NULL
, repo
, name
)));
221 unsigned int get_submodule_status(git_repository
*repo
, const char *name
)
223 unsigned int status
= 0;
225 assert(repo
&& name
);
227 cl_git_pass(git_submodule_status(&status
, repo
, name
, GIT_SUBMODULE_IGNORE_UNSPECIFIED
));
232 static int print_submodules(git_submodule
*sm
, const char *name
, void *p
)
234 unsigned int loc
= 0;
236 git_submodule_location(&loc
, sm
);
237 fprintf(stderr
, "# submodule %s (at %s) flags %x\n",
238 name
, git_submodule_path(sm
), loc
);
242 void dump_submodules(git_repository
*repo
)
244 git_submodule_foreach(repo
, print_submodules
, NULL
);