]> git.proxmox.com Git - libgit2.git/commitdiff
index: Make _read() cope with index file creation
authornulltoken <emeric.fermas@gmail.com>
Fri, 4 Oct 2013 12:03:12 +0000 (14:03 +0200)
committernulltoken <emeric.fermas@gmail.com>
Fri, 4 Oct 2013 13:54:36 +0000 (15:54 +0200)
src/index.c
tests-clar/index/tests.c

index 21a8d31d1fd170fc4d759b1af24e1c92c7911942..c923f1675ef10528198e51cc8a1ef2b5847662c2 100644 (file)
@@ -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;
        }
 
index 0528eb110babb7151e672b17bd34b678fa633573..009d393d7667412695bce3a9cfd3255687977b1f 100644 (file)
@@ -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);
+}