summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@microsoft.com>2014-05-08 17:35:03 -0700
committerEdward Thomson <ethomson@edwardthomson.com>2015-01-16 18:54:16 -0500
commit84330788e44b2c9673ee51b3647b057de170be91 (patch)
treea12d3375d30c87209b0405be75f49a217af6c0a2
parent9a8753d74637ada93ac8fc3aa9cad9d3611efbe8 (diff)
downloadlibgit2-84330788e44b2c9673ee51b3647b057de170be91.tar.gz
Introduce test for checkout case-changing rename
-rw-r--r--tests/checkout/tree.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/tests/checkout/tree.c b/tests/checkout/tree.c
index b5fe11128..9ed208c24 100644
--- a/tests/checkout/tree.c
+++ b/tests/checkout/tree.c
@@ -949,3 +949,79 @@ void test_checkout_tree__filemode_preserved_in_index(void)
git_index_free(index);
}
+void test_checkout_tree__case_changing_rename(void)
+{
+ git_index *index;
+ git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
+ git_oid master_id, dir_commit_id, tree_id, commit_id;
+ git_commit *master_commit, *dir_commit;
+ git_tree *tree;
+ git_signature *signature;
+ const git_index_entry *index_entry;
+ bool case_sensitive;
+
+ assert_on_branch(g_repo, "master");
+
+ cl_git_pass(git_repository_index(&index, g_repo));
+
+ /* Switch branches and perform a case-changing rename */
+
+ opts.checkout_strategy = GIT_CHECKOUT_FORCE;
+
+ cl_git_pass(git_reference_name_to_id(&dir_commit_id, g_repo, "refs/heads/dir"));
+ cl_git_pass(git_commit_lookup(&dir_commit, g_repo, &dir_commit_id));
+
+ cl_git_pass(git_checkout_tree(g_repo, (git_object *)dir_commit, &opts));
+ cl_git_pass(git_repository_set_head(g_repo, "refs/heads/dir", NULL, NULL));
+
+ cl_assert(git_path_isfile("testrepo/README"));
+ case_sensitive = !git_path_isfile("testrepo/readme");
+
+ cl_assert(index_entry = git_index_get_bypath(index, "README", 0));
+ cl_assert_equal_s("README", index_entry->path);
+
+ cl_git_pass(git_index_remove_bypath(index, "README"));
+ cl_git_pass(p_rename("testrepo/README", "testrepo/__readme__"));
+ cl_git_pass(p_rename("testrepo/__readme__", "testrepo/readme"));
+ cl_git_append2file("testrepo/readme", "An addendum...");
+ cl_git_pass(git_index_add_bypath(index, "readme"));
+
+ cl_git_pass(git_index_write(index));
+
+ cl_git_pass(git_index_write_tree(&tree_id, index));
+ cl_git_pass(git_tree_lookup(&tree, g_repo, &tree_id));
+
+ cl_git_pass(git_signature_new(&signature, "Renamer", "rename@contoso.com", time(NULL), 0));
+
+ cl_git_pass(git_commit_create(&commit_id, g_repo, "refs/heads/dir", signature, signature, NULL, "case-changing rename", tree, 1, (const git_commit **)&dir_commit));
+
+ cl_assert(git_path_isfile("testrepo/readme"));
+ if (case_sensitive)
+ cl_assert(!git_path_isfile("testrepo/README"));
+
+ cl_assert(index_entry = git_index_get_bypath(index, "readme", 0));
+ cl_assert_equal_s("readme", index_entry->path);
+
+ /* Switching back to master should rename readme -> README */
+ opts.checkout_strategy = GIT_CHECKOUT_SAFE;
+
+ cl_git_pass(git_reference_name_to_id(&master_id, g_repo, "refs/heads/master"));
+ cl_git_pass(git_commit_lookup(&master_commit, g_repo, &master_id));
+
+ cl_git_pass(git_checkout_tree(g_repo, (git_object *)master_commit, &opts));
+ cl_git_pass(git_repository_set_head(g_repo, "refs/heads/master", NULL, NULL));
+
+ assert_on_branch(g_repo, "master");
+
+ cl_assert(git_path_isfile("testrepo/README"));
+ if (case_sensitive)
+ cl_assert(!git_path_isfile("testrepo/readme"));
+
+ cl_assert(index_entry = git_index_get_bypath(index, "README", 0));
+ cl_assert_equal_s("README", index_entry->path);
+
+ git_signature_free(signature);
+ git_tree_free(tree);
+ git_commit_free(dir_commit);
+ git_commit_free(master_commit);
+}