mirror of
https://git.proxmox.com/git/libgit2
synced 2025-10-17 23:05:14 +00:00
checkout: do not delete directories with untracked entries
If the `GIT_CHECKOUT_FORCE` flag is given to any of the `git_checkout` invocations, we remove files which were previously staged. But while doing so, we unfortunately also remove unstaged files in a directory which contains at least one staged file, resulting in potential data loss. This commit adds two tests to verify behavior.
This commit is contained in:
parent
78b8f0392c
commit
0ef405b3c8
@ -60,3 +60,79 @@ void test_checkout_head__with_index_only_tree(void)
|
||||
|
||||
git_index_free(index);
|
||||
}
|
||||
|
||||
void test_checkout_head__do_not_remove_untracked_file(void)
|
||||
{
|
||||
git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
|
||||
git_index *index;
|
||||
|
||||
cl_git_pass(p_mkdir("testrepo/tracked", 0755));
|
||||
cl_git_mkfile("testrepo/tracked/tracked", "tracked\n");
|
||||
cl_git_mkfile("testrepo/tracked/untracked", "untracked\n");
|
||||
|
||||
cl_git_pass(git_repository_index(&index, g_repo));
|
||||
cl_git_pass(git_index_add_bypath(index, "tracked/tracked"));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
git_index_free(index);
|
||||
|
||||
opts.checkout_strategy = GIT_CHECKOUT_FORCE;
|
||||
cl_git_pass(git_checkout_head(g_repo, &opts));
|
||||
|
||||
cl_assert(!git_path_isfile("testrepo/tracked/tracked"));
|
||||
cl_assert(git_path_isfile("testrepo/tracked/untracked"));
|
||||
}
|
||||
|
||||
void test_checkout_head__do_not_remove_untracked_file_in_subdir(void)
|
||||
{
|
||||
git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
|
||||
git_index *index;
|
||||
|
||||
cl_git_pass(p_mkdir("testrepo/tracked", 0755));
|
||||
cl_git_pass(p_mkdir("testrepo/tracked/subdir", 0755));
|
||||
cl_git_mkfile("testrepo/tracked/tracked", "tracked\n");
|
||||
cl_git_mkfile("testrepo/tracked/subdir/tracked", "tracked\n");
|
||||
cl_git_mkfile("testrepo/tracked/subdir/untracked", "untracked\n");
|
||||
|
||||
cl_git_pass(git_repository_index(&index, g_repo));
|
||||
cl_git_pass(git_index_add_bypath(index, "tracked/tracked"));
|
||||
cl_git_pass(git_index_add_bypath(index, "tracked/subdir/tracked"));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
git_index_free(index);
|
||||
|
||||
opts.checkout_strategy = GIT_CHECKOUT_FORCE;
|
||||
cl_git_pass(git_checkout_head(g_repo, &opts));
|
||||
|
||||
cl_assert(!git_path_isfile("testrepo/tracked/tracked"));
|
||||
cl_assert(!git_path_isfile("testrepo/tracked/subdir/tracked"));
|
||||
cl_assert(git_path_isfile("testrepo/tracked/subdir/untracked"));
|
||||
}
|
||||
|
||||
void test_checkout_head__do_remove_tracked_subdir(void)
|
||||
{
|
||||
git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
|
||||
git_index *index;
|
||||
|
||||
cl_git_pass(p_mkdir("testrepo/subdir", 0755));
|
||||
cl_git_pass(p_mkdir("testrepo/subdir/tracked", 0755));
|
||||
cl_git_mkfile("testrepo/subdir/tracked-file", "tracked\n");
|
||||
cl_git_mkfile("testrepo/subdir/untracked-file", "untracked\n");
|
||||
cl_git_mkfile("testrepo/subdir/tracked/tracked1", "tracked\n");
|
||||
cl_git_mkfile("testrepo/subdir/tracked/tracked2", "tracked\n");
|
||||
|
||||
cl_git_pass(git_repository_index(&index, g_repo));
|
||||
cl_git_pass(git_index_add_bypath(index, "subdir/tracked-file"));
|
||||
cl_git_pass(git_index_add_bypath(index, "subdir/tracked/tracked1"));
|
||||
cl_git_pass(git_index_add_bypath(index, "subdir/tracked/tracked2"));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
git_index_free(index);
|
||||
|
||||
opts.checkout_strategy = GIT_CHECKOUT_FORCE;
|
||||
cl_git_pass(git_checkout_head(g_repo, &opts));
|
||||
|
||||
cl_assert(!git_path_isdir("testrepo/subdir/tracked"));
|
||||
cl_assert(!git_path_isfile("testrepo/subdir/tracked-file"));
|
||||
cl_assert(git_path_isfile("testrepo/subdir/untracked-file"));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user