Commit 29c16698b2014e949af3fce2fb4b9d49a2f2d717

Vicent Martí 2012-11-10T20:24:23

Merge pull request #1060 from nulltoken/topic/explicit-index-errors Topic/explicit index errors

diff --git a/src/index.c b/src/index.c
index 214d29d..fed067c 100644
--- a/src/index.c
+++ b/src/index.c
@@ -259,7 +259,7 @@ int git_index_open(git_index **index_out, const char *index_path)
 {
 	git_index *index;
 
-	assert(index_out && index_path);
+	assert(index_out);
 
 	index = git__calloc(1, sizeof(git_index));
 	GITERR_CHECK_ALLOC(index);
@@ -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);
@@ -472,13 +471,11 @@ int git_index_write_tree(git_oid *oid, git_index *index)
 
 	assert(oid && index);
 
-	repo = (git_repository *)GIT_REFCOUNT_OWNER(index);
+	repo = INDEX_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
new file mode 100644
index 0000000..c997b96
--- /dev/null
+++ b/tests-clar/index/inmemory.c
@@ -0,0 +1,22 @@
+#include "clar_libgit2.h"
+
+void test_index_inmemory__can_create_an_inmemory_index(void)
+{
+	git_index *index;
+
+	cl_git_pass(git_index_new(&index));
+	cl_assert_equal_i(0, git_index_entrycount(index));
+
+	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);
+}
diff --git a/tests-clar/stash/save.c b/tests-clar/stash/save.c
index 01acf67..7524cde 100644
--- a/tests-clar/stash/save.c
+++ b/tests-clar/stash/save.c
@@ -246,8 +246,8 @@ void test_stash_save__cannot_stash_when_there_are_no_local_change(void)
 	 * 'what' and 'who' are being committed.
 	 * 'when' remain untracked.
 	 */
-	git_index_add_from_workdir(index, "what");
-	git_index_add_from_workdir(index, "who");
+	cl_git_pass(git_index_add_from_workdir(index, "what"));
+	cl_git_pass(git_index_add_from_workdir(index, "who"));
 	cl_git_pass(git_index_write(index));
 	commit_staged_files(&commit_oid, index, signature);
 	git_index_free(index);
@@ -356,7 +356,7 @@ void test_stash_save__can_stage_normal_then_stage_untracked(void)
 
 void test_stash_save__including_untracked_without_any_untracked_file_creates_an_empty_tree(void)
 {
-	p_unlink("stash/when");
+	cl_git_pass(p_unlink("stash/when"));
 
 	assert_status("what", GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_MODIFIED);
 	assert_status("how", GIT_STATUS_INDEX_MODIFIED);