index: refine add_from_workdir() error report
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 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
diff --git a/src/index.c b/src/index.c
index 6c04177..c68d0dc 100644
--- a/src/index.c
+++ b/src/index.c
@@ -348,6 +348,12 @@ void git_index_clear(git_index *index)
index->tree = NULL;
}
+static int create_index_error(int error, const char *msg)
+{
+ giterr_set(GITERR_INDEX, msg);
+ return error;
+}
+
int git_index_set_caps(git_index *index, unsigned int caps)
{
int old_ignore_case;
@@ -362,11 +368,8 @@ int git_index_set_caps(git_index *index, unsigned int caps)
if (INDEX_OWNER(index) == NULL ||
git_repository_config__weakptr(&cfg, INDEX_OWNER(index)) < 0)
- {
- giterr_set(GITERR_INDEX,
- "Cannot get repository config to set index caps");
- return -1;
- }
+ return create_index_error(-1,
+ "Cannot get repository config to set index caps");
if (git_config_get_bool(&val, cfg, "core.ignorecase") == 0)
index->ignore_case = (val != 0);
@@ -402,11 +405,9 @@ int git_index_read(git_index *index)
git_buf buffer = GIT_BUF_INIT;
git_futils_filestamp stamp;
- if (!index->index_file_path) {
- giterr_set(GITERR_INDEX,
+ if (!index->index_file_path)
+ return create_index_error(-1,
"Failed to read index: The index is in-memory only");
- return -1;
- }
if (!index->on_disk || git_path_exists(index->index_file_path) == false) {
git_index_clear(index);
@@ -437,11 +438,9 @@ int git_index_write(git_index *index)
git_filebuf file = GIT_FILEBUF_INIT;
int error;
- if (!index->index_file_path) {
- giterr_set(GITERR_INDEX,
- "Failed to write index: The index is in-memory only");
- return -1;
- }
+ if (!index->index_file_path)
+ return create_index_error(-1,
+ "Failed to read index: The index is in-memory only");
git_vector_sort(&index->entries);
git_vector_sort(&index->reuc);
@@ -474,11 +473,9 @@ int git_index_write_tree(git_oid *oid, git_index *index)
repo = (git_repository *)GIT_REFCOUNT_OWNER(index);
- if (repo == NULL) {
- giterr_set(GITERR_INDEX, "Failed to write tree. "
+ if (repo == NULL)
+ return create_index_error(-1, "Failed to write tree. "
"The index file is not backed up by an existing repository");
- return -1;
- }
return git_tree__write_index(oid, index, repo);
}
@@ -539,13 +536,16 @@ static int index_entry_init(git_index_entry **entry_out, git_index *index, const
git_buf full_path = GIT_BUF_INIT;
int error;
- if (INDEX_OWNER(index) == NULL ||
- (workdir = git_repository_workdir(INDEX_OWNER(index))) == NULL)
- {
- giterr_set(GITERR_INDEX,
+ if (INDEX_OWNER(index) == NULL)
+ return create_index_error(-1,
+ "Could not initialize index entry. "
+ "Index is not backed up by an existing repository.");
+
+ workdir = git_repository_workdir(INDEX_OWNER(index));
+
+ if (!workdir)
+ return create_index_error(GIT_EBAREREPO,
"Could not initialize index entry. Repository is bare");
- return -1;
- }
if ((error = git_buf_joinpath(&full_path, workdir, rel_path)) < 0)
return error;
diff --git a/tests-clar/index/inmemory.c b/tests-clar/index/inmemory.c
index 9c5c0b7..c997b96 100644
--- a/tests-clar/index/inmemory.c
+++ b/tests-clar/index/inmemory.c
@@ -9,3 +9,14 @@ void test_index_inmemory__can_create_an_inmemory_index(void)
git_index_free(index);
}
+
+void test_index_inmemory__cannot_add_from_workdir_to_an_inmemory_index(void)
+{
+ git_index *index;
+
+ cl_git_pass(git_index_new(&index));
+
+ cl_assert_equal_i(GIT_ERROR, git_index_add_from_workdir(index, "test.txt"));
+
+ git_index_free(index);
+}
diff --git a/tests-clar/index/tests.c b/tests-clar/index/tests.c
index cf971e1..d3f6f25 100644
--- a/tests-clar/index/tests.c
+++ b/tests-clar/index/tests.c
@@ -248,3 +248,16 @@ void test_index_tests__add(void)
git_repository_free(repo);
}
+void test_index_tests__add_from_workdir_to_a_bare_repository_returns_EBAREPO(void)
+{
+ git_repository *bare_repo;
+ git_index *index;
+
+ cl_git_pass(git_repository_open(&bare_repo, cl_fixture("testrepo.git")));
+ cl_git_pass(git_repository_index(&index, bare_repo));
+
+ cl_assert_equal_i(GIT_EBAREREPO, git_index_add_from_workdir(index, "test.txt"));
+
+ git_index_free(index);
+ git_repository_free(bare_repo);
+}