mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-13 17:21:09 +00:00
Merge pull request #4260 from libgit2/ethomson/forced_checkout_2
Update to forced checkout and untracked files
This commit is contained in:
commit
d2c4f7645c
@ -370,10 +370,8 @@ static int checkout_action_wd_only(
|
|||||||
*/
|
*/
|
||||||
const git_index_entry *e = git_index_get_byindex(data->index, pos);
|
const git_index_entry *e = git_index_get_byindex(data->index, pos);
|
||||||
|
|
||||||
if (e != NULL && data->diff->pfxcomp(e->path, wd->path) == 0) {
|
if (e != NULL && data->diff->pfxcomp(e->path, wd->path) == 0)
|
||||||
notify = GIT_CHECKOUT_NOTIFY_DIRTY;
|
return git_iterator_advance_into(wditem, workdir);
|
||||||
remove = ((data->strategy & GIT_CHECKOUT_FORCE) != 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -770,6 +770,9 @@ static int futils__rmdir_empty_parent(void *opaque, const char *path)
|
|||||||
|
|
||||||
if (en == ENOENT || en == ENOTDIR) {
|
if (en == ENOENT || en == ENOTDIR) {
|
||||||
/* do nothing */
|
/* do nothing */
|
||||||
|
} else if ((data->flags & GIT_RMDIR_SKIP_NONEMPTY) == 0 &&
|
||||||
|
en == EBUSY) {
|
||||||
|
error = git_path_set_error(errno, path, "rmdir");
|
||||||
} else if (en == ENOTEMPTY || en == EEXIST || en == EBUSY) {
|
} else if (en == ENOTEMPTY || en == EEXIST || en == EBUSY) {
|
||||||
error = GIT_ITEROVER;
|
error = GIT_ITEROVER;
|
||||||
} else {
|
} else {
|
||||||
|
@ -38,7 +38,7 @@ void test_checkout_head__with_index_only_tree(void)
|
|||||||
cl_git_pass(git_repository_index(&index, g_repo));
|
cl_git_pass(git_repository_index(&index, g_repo));
|
||||||
|
|
||||||
p_mkdir("testrepo/newdir", 0777);
|
p_mkdir("testrepo/newdir", 0777);
|
||||||
cl_git_mkfile("testrepo/newdir/newfile.txt", "new file\n");
|
cl_git_mkfile("testrepo/newdir/newfile.txt", "new file\n");
|
||||||
|
|
||||||
cl_git_pass(git_index_add_bypath(index, "newdir/newfile.txt"));
|
cl_git_pass(git_index_add_bypath(index, "newdir/newfile.txt"));
|
||||||
cl_git_pass(git_index_write(index));
|
cl_git_pass(git_index_write(index));
|
||||||
@ -60,3 +60,79 @@ void test_checkout_head__with_index_only_tree(void)
|
|||||||
|
|
||||||
git_index_free(index);
|
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