From da7b78fa446b31e7e197d51129d9bd005acc69da Mon Sep 17 00:00:00 2001 From: nulltoken Date: Fri, 4 Oct 2013 14:03:12 +0200 Subject: [PATCH] index: Make _read() cope with index file creation --- src/index.c | 5 ++-- tests-clar/index/tests.c | 50 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/index.c b/src/index.c index 21a8d31d1..c923f1675 100644 --- a/src/index.c +++ b/src/index.c @@ -461,9 +461,10 @@ int git_index_read(git_index *index) return create_index_error(-1, "Failed to read index: The index is in-memory only"); - if (!index->on_disk || git_path_exists(index->index_file_path) == false) { + index->on_disk = git_path_exists(index->index_file_path); + + if (!index->on_disk) { git_index_clear(index); - index->on_disk = 0; return 0; } diff --git a/tests-clar/index/tests.c b/tests-clar/index/tests.c index 0528eb110..009d393d7 100644 --- a/tests-clar/index/tests.c +++ b/tests-clar/index/tests.c @@ -484,3 +484,53 @@ void test_index_tests__elocked(void) git_index_free(index); git_repository_free(repo); } + +void test_index_tests__reload_from_disk(void) +{ + git_repository *repo; + git_index *read_index; + git_index *write_index; + + cl_set_cleanup(&cleanup_myrepo, NULL); + + cl_git_pass(git_futils_mkdir("./myrepo", NULL, 0777, GIT_MKDIR_PATH)); + cl_git_mkfile("./myrepo/a.txt", "a\n"); + cl_git_mkfile("./myrepo/b.txt", "b\n"); + + cl_git_pass(git_repository_init(&repo, "./myrepo", 0)); + cl_git_pass(git_repository_index(&write_index, repo)); + cl_assert_equal_i(false, write_index->on_disk); + + cl_git_pass(git_index_open(&read_index, write_index->index_file_path)); + cl_assert_equal_i(false, read_index->on_disk); + + /* Stage two new files agaisnt the write_index */ + cl_git_pass(git_index_add_bypath(write_index, "a.txt")); + cl_git_pass(git_index_add_bypath(write_index, "b.txt")); + + cl_assert_equal_sz(2, git_index_entrycount(write_index)); + + /* Persist the index changes to disk */ + cl_git_pass(git_index_write(write_index)); + cl_assert_equal_i(true, write_index->on_disk); + + /* Sync the changes back into the read_index */ + cl_assert_equal_sz(0, git_index_entrycount(read_index)); + + cl_git_pass(git_index_read(read_index)); + cl_assert_equal_i(true, read_index->on_disk); + + cl_assert_equal_sz(2, git_index_entrycount(read_index)); + + /* Remove the index file from the filesystem */ + cl_git_pass(p_unlink(write_index->index_file_path)); + + /* Sync the changes back into the read_index */ + cl_git_pass(git_index_read(read_index)); + cl_assert_equal_i(false, read_index->on_disk); + cl_assert_equal_sz(0, git_index_entrycount(read_index)); + + git_index_free(read_index); + git_index_free(write_index); + git_repository_free(repo); +}