|
Packit Service |
20376f |
#include "clar_libgit2.h"
|
|
Packit Service |
20376f |
#include "buffer.h"
|
|
Packit Service |
20376f |
#include "path.h"
|
|
Packit Service |
20376f |
#include "util.h"
|
|
Packit Service |
20376f |
#include "posix.h"
|
|
Packit Service |
20376f |
#include "submodule_helpers.h"
|
|
Packit Service |
20376f |
#include "git2/sys/repository.h"
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
/* rewrite gitmodules -> .gitmodules
|
|
Packit Service |
20376f |
* rewrite the empty or relative urls inside each module
|
|
Packit Service |
20376f |
* rename the .gitted directory inside any submodule to .git
|
|
Packit Service |
20376f |
*/
|
|
Packit Service |
20376f |
void rewrite_gitmodules(const char *workdir)
|
|
Packit Service |
20376f |
{
|
|
Packit Service |
20376f |
git_buf in_f = GIT_BUF_INIT, out_f = GIT_BUF_INIT, path = GIT_BUF_INIT;
|
|
Packit Service |
20376f |
FILE *in, *out;
|
|
Packit Service |
20376f |
char line[256];
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_git_pass(git_buf_joinpath(&in_f, workdir, "gitmodules"));
|
|
Packit Service |
20376f |
cl_git_pass(git_buf_joinpath(&out_f, workdir, ".gitmodules"));
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_assert((in = fopen(in_f.ptr, "rb")) != NULL);
|
|
Packit Service |
20376f |
cl_assert((out = fopen(out_f.ptr, "wb")) != NULL);
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
while (fgets(line, sizeof(line), in) != NULL) {
|
|
Packit Service |
20376f |
char *scan = line;
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
while (*scan == ' ' || *scan == '\t') scan++;
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
/* rename .gitted -> .git in submodule directories */
|
|
Packit Service |
20376f |
if (git__prefixcmp(scan, "path =") == 0) {
|
|
Packit Service |
20376f |
scan += strlen("path =");
|
|
Packit Service |
20376f |
while (*scan == ' ') scan++;
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
git_buf_joinpath(&path, workdir, scan);
|
|
Packit Service |
20376f |
git_buf_rtrim(&path);
|
|
Packit Service |
20376f |
git_buf_joinpath(&path, path.ptr, ".gitted");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
if (!git_buf_oom(&path) && p_access(path.ptr, F_OK) == 0) {
|
|
Packit Service |
20376f |
git_buf_joinpath(&out_f, workdir, scan);
|
|
Packit Service |
20376f |
git_buf_rtrim(&out_f);
|
|
Packit Service |
20376f |
git_buf_joinpath(&out_f, out_f.ptr, ".git");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
if (!git_buf_oom(&out_f))
|
|
Packit Service |
20376f |
p_rename(path.ptr, out_f.ptr);
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
/* copy non-"url =" lines verbatim */
|
|
Packit Service |
20376f |
if (git__prefixcmp(scan, "url =") != 0) {
|
|
Packit Service |
20376f |
fputs(line, out);
|
|
Packit Service |
20376f |
continue;
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
/* convert relative URLs in "url =" lines */
|
|
Packit Service |
20376f |
scan += strlen("url =");
|
|
Packit Service |
20376f |
while (*scan == ' ') scan++;
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
if (*scan == '.') {
|
|
Packit Service |
20376f |
git_buf_joinpath(&path, workdir, scan);
|
|
Packit Service |
20376f |
git_buf_rtrim(&path);
|
|
Packit Service |
20376f |
} else if (!*scan || *scan == '\n') {
|
|
Packit Service |
20376f |
git_buf_joinpath(&path, workdir, "../testrepo.git");
|
|
Packit Service |
20376f |
} else {
|
|
Packit Service |
20376f |
fputs(line, out);
|
|
Packit Service |
20376f |
continue;
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
git_path_prettify(&path, path.ptr, NULL);
|
|
Packit Service |
20376f |
git_buf_putc(&path, '\n');
|
|
Packit Service |
20376f |
cl_assert(!git_buf_oom(&path));
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
fwrite(line, scan - line, sizeof(char), out);
|
|
Packit Service |
20376f |
fputs(path.ptr, out);
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
fclose(in);
|
|
Packit Service |
20376f |
fclose(out);
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_must_pass(p_unlink(in_f.ptr));
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
git_buf_free(&in_f);
|
|
Packit Service |
20376f |
git_buf_free(&out_f);
|
|
Packit Service |
20376f |
git_buf_free(&path);
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
static void cleanup_fixture_submodules(void *payload)
|
|
Packit Service |
20376f |
{
|
|
Packit Service |
20376f |
cl_git_sandbox_cleanup(); /* either "submodules" or "submod2" */
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
if (payload)
|
|
Packit Service |
20376f |
cl_fixture_cleanup(payload);
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
git_repository *setup_fixture_submodules(void)
|
|
Packit Service |
20376f |
{
|
|
Packit Service |
20376f |
git_repository *repo = cl_git_sandbox_init("submodules");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_fixture_sandbox("testrepo.git");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
rewrite_gitmodules(git_repository_workdir(repo));
|
|
Packit Service |
20376f |
p_rename("submodules/testrepo/.gitted", "submodules/testrepo/.git");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_set_cleanup(cleanup_fixture_submodules, "testrepo.git");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_git_pass(git_repository_reinit_filesystem(repo, 1));
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
return repo;
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
git_repository *setup_fixture_submod2(void)
|
|
Packit Service |
20376f |
{
|
|
Packit Service |
20376f |
git_repository *repo = cl_git_sandbox_init("submod2");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_fixture_sandbox("submod2_target");
|
|
Packit Service |
20376f |
p_rename("submod2_target/.gitted", "submod2_target/.git");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
rewrite_gitmodules(git_repository_workdir(repo));
|
|
Packit Service |
20376f |
p_rename("submod2/not-submodule/.gitted", "submod2/not-submodule/.git");
|
|
Packit Service |
20376f |
p_rename("submod2/not/.gitted", "submod2/not/.git");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_set_cleanup(cleanup_fixture_submodules, "submod2_target");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_git_pass(git_repository_reinit_filesystem(repo, 1));
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
return repo;
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
git_repository *setup_fixture_submod3(void)
|
|
Packit Service |
20376f |
{
|
|
Packit Service |
20376f |
git_repository *repo = cl_git_sandbox_init("submod3");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_fixture_sandbox("submod2_target");
|
|
Packit Service |
20376f |
p_rename("submod2_target/.gitted", "submod2_target/.git");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
rewrite_gitmodules(git_repository_workdir(repo));
|
|
Packit Service |
20376f |
p_rename("submod3/One/.gitted", "submod3/One/.git");
|
|
Packit Service |
20376f |
p_rename("submod3/TWO/.gitted", "submod3/TWO/.git");
|
|
Packit Service |
20376f |
p_rename("submod3/three/.gitted", "submod3/three/.git");
|
|
Packit Service |
20376f |
p_rename("submod3/FoUr/.gitted", "submod3/FoUr/.git");
|
|
Packit Service |
20376f |
p_rename("submod3/Five/.gitted", "submod3/Five/.git");
|
|
Packit Service |
20376f |
p_rename("submod3/six/.gitted", "submod3/six/.git");
|
|
Packit Service |
20376f |
p_rename("submod3/sEvEn/.gitted", "submod3/sEvEn/.git");
|
|
Packit Service |
20376f |
p_rename("submod3/EIGHT/.gitted", "submod3/EIGHT/.git");
|
|
Packit Service |
20376f |
p_rename("submod3/nine/.gitted", "submod3/nine/.git");
|
|
Packit Service |
20376f |
p_rename("submod3/TEN/.gitted", "submod3/TEN/.git");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_set_cleanup(cleanup_fixture_submodules, "submod2_target");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_git_pass(git_repository_reinit_filesystem(repo, 1));
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
return repo;
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
git_repository *setup_fixture_super(void)
|
|
Packit Service |
20376f |
{
|
|
Packit Service |
20376f |
git_repository *repo = cl_git_sandbox_init("super");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_fixture_sandbox("sub.git");
|
|
Packit Service |
20376f |
p_mkdir("super/sub", 0777);
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
rewrite_gitmodules(git_repository_workdir(repo));
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_set_cleanup(cleanup_fixture_submodules, "sub.git");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_git_pass(git_repository_reinit_filesystem(repo, 1));
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
return repo;
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
git_repository *setup_fixture_submodule_simple(void)
|
|
Packit Service |
20376f |
{
|
|
Packit Service |
20376f |
git_repository *repo = cl_git_sandbox_init("submodule_simple");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_fixture_sandbox("testrepo.git");
|
|
Packit Service |
20376f |
p_mkdir("submodule_simple/testrepo", 0777);
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_set_cleanup(cleanup_fixture_submodules, "testrepo.git");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_git_pass(git_repository_reinit_filesystem(repo, 1));
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
return repo;
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
git_repository *setup_fixture_submodule_with_path(void)
|
|
Packit Service |
20376f |
{
|
|
Packit Service |
20376f |
git_repository *repo = cl_git_sandbox_init("submodule_with_path");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_fixture_sandbox("testrepo.git");
|
|
Packit Service |
20376f |
p_mkdir("submodule_with_path/lib", 0777);
|
|
Packit Service |
20376f |
p_mkdir("submodule_with_path/lib/testrepo", 0777);
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_set_cleanup(cleanup_fixture_submodules, "testrepo.git");
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_git_pass(git_repository_reinit_filesystem(repo, 1));
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
return repo;
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
void assert__submodule_exists(
|
|
Packit Service |
20376f |
git_repository *repo, const char *name,
|
|
Packit Service |
20376f |
const char *msg, const char *file, int line)
|
|
Packit Service |
20376f |
{
|
|
Packit Service |
20376f |
git_submodule *sm;
|
|
Packit Service |
20376f |
int error = git_submodule_lookup(&sm, repo, name);
|
|
Packit Service |
20376f |
if (error)
|
|
Packit Service |
20376f |
cl_git_report_failure(error, 0, file, line, msg);
|
|
Packit Service |
20376f |
cl_assert_at_line(sm != NULL, file, line);
|
|
Packit Service |
20376f |
git_submodule_free(sm);
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
void refute__submodule_exists(
|
|
Packit Service |
20376f |
git_repository *repo, const char *name, int expected_error,
|
|
Packit Service |
20376f |
const char *msg, const char *file, int line)
|
|
Packit Service |
20376f |
{
|
|
Packit Service |
20376f |
clar__assert_equal(
|
|
Packit Service |
20376f |
file, line, msg, 1, "%i",
|
|
Packit Service |
20376f |
expected_error, (int)(git_submodule_lookup(NULL, repo, name)));
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
unsigned int get_submodule_status(git_repository *repo, const char *name)
|
|
Packit Service |
20376f |
{
|
|
Packit Service |
20376f |
unsigned int status = 0;
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
assert(repo && name);
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
cl_git_pass(git_submodule_status(&status, repo, name, GIT_SUBMODULE_IGNORE_UNSPECIFIED));
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
return status;
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
static int print_submodules(git_submodule *sm, const char *name, void *p)
|
|
Packit Service |
20376f |
{
|
|
Packit Service |
20376f |
unsigned int loc = 0;
|
|
Packit Service |
20376f |
GIT_UNUSED(p);
|
|
Packit Service |
20376f |
git_submodule_location(&loc, sm);
|
|
Packit Service |
20376f |
fprintf(stderr, "# submodule %s (at %s) flags %x\n",
|
|
Packit Service |
20376f |
name, git_submodule_path(sm), loc);
|
|
Packit Service |
20376f |
return 0;
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|
|
Packit Service |
20376f |
void dump_submodules(git_repository *repo)
|
|
Packit Service |
20376f |
{
|
|
Packit Service |
20376f |
git_submodule_foreach(repo, print_submodules, NULL);
|
|
Packit Service |
20376f |
}
|
|
Packit Service |
20376f |
|