submodule: update index check to check path before directory and fix tests
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
diff --git a/src/submodule.c b/src/submodule.c
index 87b8801..d1a0c82 100644
--- a/src/submodule.c
+++ b/src/submodule.c
@@ -149,39 +149,44 @@ static int find_by_path(const git_config_entry *entry, void *payload)
return 0;
}
-static int can_add_submodule(git_repository *repo, const char *path) {
- int error;
+/*
+ * Checks to see if the submodule shares its name with a file or directory that
+ * already exists on the index. If so, the submodule cannot be added.
+ */
+static int can_add_submodule(git_repository *repo, const char *path)
+{
+ int error = 0;
git_index *index;
git_buf dir = GIT_BUF_INIT;
- if ((error = git_buf_sets(&dir, path)) < 0)
- return error;
-
- if ((error = git_path_to_dir(&dir)) < 0)
- return error;
-
- /* get the index for the repo */
-
if ((error = git_repository_index__weakptr(&index, repo)) < 0)
- return error;
-
- /* see if the submodule name exists as a file on the index */
+ goto out;
if ((error = git_index_find(NULL, index, path)) == 0) {
giterr_set(GITERR_SUBMODULE,
- "'%s' already exists in the index", path);
- return GIT_EEXISTS;
+ "File '%s' already exists in the index", path);
+ error = GIT_EEXISTS;
+ goto out;
}
+ error = 0;
- /* see if the submodule name exists as a directory on the index */
+ if ((error = git_buf_sets(&dir, path)) < 0)
+ goto out;
+
+ if ((error = git_path_to_dir(&dir)) < 0)
+ goto out;
if ((error = git_index_find_prefix(NULL, index, dir.ptr)) == 0) {
giterr_set(GITERR_SUBMODULE,
- "'%s' already exists in the index", path);
- return GIT_EEXISTS;
+ "Directory '%s' already exists in the index", path);
+ error = GIT_EEXISTS;
+ goto out;
}
+ error = 0;
- return 0;
+out:
+ git_buf_free(&dir);
+ return error;
}
/**
diff --git a/tests/submodule/add.c b/tests/submodule/add.c
index 125ac9a..ef7faa8 100644
--- a/tests/submodule/add.c
+++ b/tests/submodule/add.c
@@ -136,19 +136,21 @@ void test_submodule_add__path_exists_in_index(void)
git_buf dirname = GIT_BUF_INIT;
git_buf filename = GIT_BUF_INIT;
- /* In this repo, HEAD (master) has no remote tracking branc h*/
g_repo = cl_git_sandbox_init("testrepo");
- cl_git_pass(git_buf_joinpath(&dirname, git_repository_workdir(g_repo), "TestGitRepository"));
+ cl_git_pass(git_buf_joinpath(&dirname, git_repository_workdir(g_repo), "subdirectory"));
cl_git_pass(git_buf_joinpath(&filename, dirname.ptr, "test.txt"));
cl_git_pass(p_mkdir(dirname.ptr, 0700));
cl_git_mkfile(filename.ptr, "This is some content");
cl_git_pass(git_repository_index__weakptr(&index, g_repo));
- cl_git_pass(git_index_add_bypath(index, "TestGitRepository/test.txt"));
+ cl_git_pass(git_index_add_bypath(index, "subdirectory/test.txt"));
+
+ cl_git_pass(p_unlink(filename.ptr));
+ cl_git_pass(p_rmdir(dirname.ptr));
- cl_git_fail_with(git_submodule_add_setup(&sm, g_repo, "./", "TestGitRepository", 1), GIT_EEXISTS);
+ cl_git_fail_with(git_submodule_add_setup(&sm, g_repo, "./", "subdirectory", 1), GIT_EEXISTS);
git_submodule_free(sm);
git_buf_free(&dirname);
@@ -161,17 +163,18 @@ void test_submodule_add__file_exists_in_index(void)
git_submodule *sm;
git_buf name = GIT_BUF_INIT;
- /* In this repo, HEAD (master) has no remote tracking branc h*/
g_repo = cl_git_sandbox_init("testrepo");
- cl_git_pass(git_buf_joinpath(&name, git_repository_workdir(g_repo), "TestGitRepository"));
+ cl_git_pass(git_buf_joinpath(&name, git_repository_workdir(g_repo), "subdirectory"));
cl_git_mkfile(name.ptr, "Test content");
cl_git_pass(git_repository_index__weakptr(&index, g_repo));
- cl_git_pass(git_index_add_bypath(index, "TestGitRepository"));
+ cl_git_pass(git_index_add_bypath(index, "subdirectory"));
+
+ cl_git_pass(p_unlink(name.ptr));
- cl_git_fail_with(git_submodule_add_setup(&sm, g_repo, "./", "TestGitRepository", 1), GIT_EEXISTS);
+ cl_git_fail_with(git_submodule_add_setup(&sm, g_repo, "./", "subdirectory", 1), GIT_EEXISTS);
git_submodule_free(sm);
git_buf_free(&name);