Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
checkout: remove files before writing new ones
On case insensitive filesystems, we may have files in the working directory that case fold to a name we want to write. Remove those files (by default) so that we will not end up with a filename that has the unexpected case.
- Loading branch information
Showing
6 changed files
with
207 additions
and
27 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
#include "clar_libgit2.h" | ||
|
||
#include "git2/checkout.h" | ||
#include "path.h" | ||
|
||
static git_repository *repo; | ||
static git_object *obj; | ||
static git_checkout_options checkout_opts; | ||
|
||
void test_checkout_icase__initialize(void) | ||
{ | ||
git_oid id; | ||
|
||
repo = cl_git_sandbox_init("testrepo"); | ||
|
||
cl_git_pass(git_reference_name_to_id(&id, repo, "refs/heads/dir")); | ||
cl_git_pass(git_object_lookup(&obj, repo, &id, GIT_OBJ_ANY)); | ||
|
||
git_checkout_init_options(&checkout_opts, GIT_CHECKOUT_OPTIONS_VERSION); | ||
checkout_opts.checkout_strategy = GIT_CHECKOUT_FORCE; | ||
} | ||
|
||
void test_checkout_icase__cleanup(void) | ||
{ | ||
git_object_free(obj); | ||
cl_git_sandbox_cleanup(); | ||
} | ||
|
||
static void assert_name_is(const char *expected) | ||
{ | ||
char *actual; | ||
size_t actual_len, expected_len, start; | ||
|
||
cl_assert(actual = realpath(expected, NULL)); | ||
|
||
expected_len = strlen(expected); | ||
actual_len = strlen(actual); | ||
cl_assert(actual_len >= expected_len); | ||
|
||
start = actual_len - expected_len; | ||
cl_assert_equal_s(expected, actual + start); | ||
|
||
if (start) | ||
cl_assert_equal_strn("/", actual + (start - 1), 1); | ||
|
||
free(actual); | ||
} | ||
|
||
void test_checkout_icase__overwrites_files_for_files(void) | ||
{ | ||
cl_git_write2file("testrepo/NEW.txt", "neue file\n", 10, \ | ||
O_WRONLY | O_CREAT | O_TRUNC, 0644); | ||
|
||
cl_git_pass(git_checkout_tree(repo, obj, &checkout_opts)); | ||
assert_name_is("testrepo/new.txt"); | ||
} | ||
|
||
void test_checkout_icase__overwrites_links_for_files(void) | ||
{ | ||
cl_must_pass(p_symlink("../tmp", "testrepo/NEW.txt")); | ||
|
||
cl_git_pass(git_checkout_tree(repo, obj, &checkout_opts)); | ||
|
||
cl_assert(!git_path_exists("tmp")); | ||
assert_name_is("testrepo/new.txt"); | ||
} | ||
|
||
void test_checkout_icase__overwites_folders_for_files(void) | ||
{ | ||
cl_must_pass(p_mkdir("testrepo/NEW.txt", 0777)); | ||
|
||
cl_git_pass(git_checkout_tree(repo, obj, &checkout_opts)); | ||
|
||
assert_name_is("testrepo/new.txt"); | ||
cl_assert(!git_path_isdir("testrepo/new.txt")); | ||
} | ||
|
||
void test_checkout_icase__overwrites_files_for_folders(void) | ||
{ | ||
cl_git_write2file("testrepo/A", "neue file\n", 10, \ | ||
O_WRONLY | O_CREAT | O_TRUNC, 0644); | ||
|
||
cl_git_pass(git_checkout_tree(repo, obj, &checkout_opts)); | ||
assert_name_is("testrepo/a"); | ||
cl_assert(git_path_isdir("testrepo/a")); | ||
} | ||
|
||
void test_checkout_icase__overwrites_links_for_folders(void) | ||
{ | ||
cl_must_pass(p_symlink("..", "testrepo/A")); | ||
|
||
cl_git_pass(git_checkout_tree(repo, obj, &checkout_opts)); | ||
|
||
cl_assert(!git_path_exists("b.txt")); | ||
assert_name_is("testrepo/a"); | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters