From 353e991679824bd2ea146fefab6a25ce6d5577a2 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sat, 10 Nov 2012 16:43:05 +0100 Subject: [PATCH 1/4] tests: Add missing assertions --- tests-clar/stash/save.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests-clar/stash/save.c b/tests-clar/stash/save.c index 01acf672c..7524cdeb6 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); From 69c068c79f5b6d2fe5cf1ca707a130a51939abc2 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sat, 10 Nov 2012 20:42:45 +0100 Subject: [PATCH 2/4] index: make git_index_new() work with a NULL path --- src/index.c | 2 +- tests-clar/index/inmemory.c | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 tests-clar/index/inmemory.c diff --git a/src/index.c b/src/index.c index 214d29def..6c04177e5 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); diff --git a/tests-clar/index/inmemory.c b/tests-clar/index/inmemory.c new file mode 100644 index 000000000..9c5c0b7a4 --- /dev/null +++ b/tests-clar/index/inmemory.c @@ -0,0 +1,11 @@ +#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); +} From 33f95a9b32804958226f5af6a4773199f21fc5ea Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sat, 10 Nov 2012 21:01:05 +0100 Subject: [PATCH 3/4] index: refine add_from_workdir() error report --- src/index.c | 48 ++++++++++++++++++------------------- tests-clar/index/inmemory.c | 11 +++++++++ tests-clar/index/tests.c | 13 ++++++++++ 3 files changed, 48 insertions(+), 24 deletions(-) diff --git a/src/index.c b/src/index.c index 6c04177e5..c68d0dc35 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 9c5c0b7a4..c997b965f 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 cf971e1dd..d3f6f2582 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); +} From 95d73de15fd25b543e4162599d095ba45f726158 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sat, 10 Nov 2012 21:10:49 +0100 Subject: [PATCH 4/4] index: prefer INDEX_OWNER usage --- src/index.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.c b/src/index.c index c68d0dc35..fed067cb0 100644 --- a/src/index.c +++ b/src/index.c @@ -471,7 +471,7 @@ 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) return create_index_error(-1, "Failed to write tree. "