mirror of
https://git.proxmox.com/git/libgit2
synced 2025-06-18 23:49:43 +00:00
Added some tests for issue #1397
Signed-off-by: Sven Strickroth <email@cs-ware.de>
This commit is contained in:
parent
9733e80c2a
commit
b8acb775e2
@ -35,6 +35,7 @@ void test_checkout_crlf__detect_crlf_autocrlf_false(void)
|
||||
git_checkout_head(g_repo, &opts);
|
||||
|
||||
test_file_contents("./crlf/all-lf", ALL_LF_TEXT_RAW);
|
||||
test_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_RAW);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -55,6 +56,9 @@ void test_checkout_crlf__autocrlf_false_index_size_is_unfiltered_size(void)
|
||||
cl_assert((entry = git_index_get_bypath(index, "all-lf", 0)) != NULL);
|
||||
cl_assert(entry->file_size == strlen(ALL_LF_TEXT_RAW));
|
||||
|
||||
cl_assert((entry = git_index_get_bypath(index, "all-crlf", 0)) != NULL);
|
||||
cl_assert(entry->file_size == strlen(ALL_CRLF_TEXT_RAW));
|
||||
|
||||
git_index_free(index);
|
||||
#endif
|
||||
}
|
||||
@ -70,6 +74,7 @@ void test_checkout_crlf__detect_crlf_autocrlf_true(void)
|
||||
git_checkout_head(g_repo, &opts);
|
||||
|
||||
test_file_contents("./crlf/all-lf", ALL_LF_TEXT_AS_CRLF);
|
||||
test_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_RAW);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -90,6 +95,9 @@ void test_checkout_crlf__autocrlf_true_index_size_is_filtered_size(void)
|
||||
cl_assert((entry = git_index_get_bypath(index, "all-lf", 0)) != NULL);
|
||||
cl_assert(entry->file_size == strlen(ALL_LF_TEXT_AS_CRLF));
|
||||
|
||||
cl_assert((entry = git_index_get_bypath(index, "all-crlf", 0)) != NULL);
|
||||
cl_assert(entry->file_size == strlen(ALL_CRLF_TEXT_RAW));
|
||||
|
||||
git_index_free(index);
|
||||
#endif
|
||||
}
|
||||
|
@ -488,3 +488,20 @@ void test_checkout_index__can_checkout_a_newly_initialized_repository(void)
|
||||
|
||||
cl_git_pass(git_checkout_index(g_repo, NULL, NULL));
|
||||
}
|
||||
|
||||
void test_checkout_index__issue_1397(void)
|
||||
{
|
||||
git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT;
|
||||
|
||||
test_checkout_index__cleanup();
|
||||
|
||||
g_repo = cl_git_sandbox_init("issue_1397");
|
||||
|
||||
set_core_autocrlf_to(true);
|
||||
|
||||
opts.checkout_strategy = GIT_CHECKOUT_FORCE;
|
||||
|
||||
cl_git_pass(git_checkout_index(g_repo, NULL, &opts));
|
||||
|
||||
test_file_contents("./issue_1397/crlf_file.txt", "first line\r\nsecond line\r\nboth with crlf");
|
||||
}
|
||||
|
@ -481,3 +481,37 @@ void test_checkout_tree__can_checkout_with_last_workdir_item_missing(void)
|
||||
git_commit_free(commit);
|
||||
git_index_free(index);
|
||||
}
|
||||
|
||||
void test_checkout_tree__issue_1397(void)
|
||||
{
|
||||
git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT;
|
||||
git_config *cfg;
|
||||
const char *partial_oid = "8a7ef04";
|
||||
size_t len = strlen(partial_oid);
|
||||
git_oid oid;
|
||||
git_object *obj = NULL;
|
||||
git_tree *tree = NULL;
|
||||
|
||||
g_repo = cl_git_sandbox_init("issue_1397");
|
||||
|
||||
cl_git_pass(git_repository_config(&cfg, g_repo));
|
||||
cl_git_pass(git_config_set_bool(cfg, "core.autocrlf", true));
|
||||
git_config_free(cfg);
|
||||
|
||||
if (git_oid_fromstrn(&oid, partial_oid, len) == 0)
|
||||
git_object_lookup_prefix(&obj, g_repo, &oid, len, GIT_OBJ_ANY);
|
||||
cl_assert(obj);
|
||||
cl_assert(git_object_type(obj) == GIT_OBJ_COMMIT);
|
||||
cl_git_pass(git_commit_tree(&tree, (git_commit *)obj));
|
||||
git_object_free(obj);
|
||||
|
||||
opts.checkout_strategy = GIT_CHECKOUT_FORCE;
|
||||
|
||||
cl_assert(tree != NULL);
|
||||
|
||||
git_checkout_tree(g_repo, (git_object *)tree, &opts);
|
||||
|
||||
test_file_contents("./issue_1397/crlf_file.txt", "first line\r\nsecond line\r\nboth with crlf");
|
||||
|
||||
git_tree_free(tree);
|
||||
}
|
||||
|
@ -431,3 +431,28 @@ void test_diff_tree__regular_blob_mode_changed_to_executable_file(void)
|
||||
cl_assert_equal_i(0, expect.file_status[GIT_DELTA_ADDED]);
|
||||
cl_assert_equal_i(0, expect.file_status[GIT_DELTA_TYPECHANGE]);
|
||||
}
|
||||
|
||||
void test_diff_tree__issue_1397(void)
|
||||
{
|
||||
// this test shows, that it is not needed
|
||||
git_config *cfg;
|
||||
g_repo = cl_git_sandbox_init("issue_1397");
|
||||
|
||||
cl_git_pass(git_repository_config(&cfg, g_repo));
|
||||
cl_git_pass(git_config_set_bool(cfg, "core.autocrlf", true));
|
||||
git_config_free(cfg);
|
||||
|
||||
cl_assert((a = resolve_commit_oid_to_tree(g_repo, "8a7ef04")) != NULL);
|
||||
cl_assert((b = resolve_commit_oid_to_tree(g_repo, "7f483a7")) != NULL);
|
||||
|
||||
cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, &opts));
|
||||
|
||||
cl_git_pass(git_diff_foreach(
|
||||
diff, diff_file_cb, diff_hunk_cb, diff_line_cb, &expect));
|
||||
|
||||
cl_assert_equal_i(1, expect.files);
|
||||
cl_assert_equal_i(0, expect.file_status[GIT_DELTA_DELETED]);
|
||||
cl_assert_equal_i(1, expect.file_status[GIT_DELTA_MODIFIED]);
|
||||
cl_assert_equal_i(0, expect.file_status[GIT_DELTA_ADDED]);
|
||||
cl_assert_equal_i(0, expect.file_status[GIT_DELTA_TYPECHANGE]);
|
||||
}
|
||||
|
@ -1084,3 +1084,182 @@ void test_diff_workdir__can_diff_empty_file(void)
|
||||
git_diff_patch_free(patch);
|
||||
git_diff_list_free(diff);
|
||||
}
|
||||
|
||||
static void set_config_entry_to(const char *entry_name, bool value)
|
||||
{
|
||||
git_config *cfg;
|
||||
|
||||
cl_git_pass(git_repository_config(&cfg, g_repo));
|
||||
cl_git_pass(git_config_set_bool(cfg, entry_name, value));
|
||||
|
||||
git_config_free(cfg);
|
||||
}
|
||||
|
||||
static void set_core_autocrlf_to(bool value)
|
||||
{
|
||||
set_config_entry_to("core.autocrlf", value);
|
||||
}
|
||||
|
||||
void test_diff_workdir__to_index_issue_1397(void)
|
||||
{
|
||||
git_diff_options opts = GIT_DIFF_OPTIONS_INIT;
|
||||
git_diff_list *diff = NULL;
|
||||
diff_expects exp;
|
||||
int use_iterator;
|
||||
|
||||
g_repo = cl_git_sandbox_init("issue_1397");
|
||||
|
||||
set_core_autocrlf_to(true);
|
||||
|
||||
opts.context_lines = 3;
|
||||
opts.interhunk_lines = 1;
|
||||
|
||||
cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts));
|
||||
|
||||
for (use_iterator = 0; use_iterator <= 1; use_iterator++) {
|
||||
memset(&exp, 0, sizeof(exp));
|
||||
|
||||
if (use_iterator)
|
||||
cl_git_pass(diff_foreach_via_iterator(
|
||||
diff, diff_file_cb, diff_hunk_cb, diff_line_cb, &exp));
|
||||
else
|
||||
cl_git_pass(git_diff_foreach(
|
||||
diff, diff_file_cb, diff_hunk_cb, diff_line_cb, &exp));
|
||||
|
||||
cl_assert_equal_i(0, exp.files);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_DELETED]);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_MODIFIED]);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_IGNORED]);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_UNTRACKED]);
|
||||
|
||||
cl_assert_equal_i(0, exp.hunks);
|
||||
|
||||
cl_assert_equal_i(0, exp.lines);
|
||||
cl_assert_equal_i(0, exp.line_ctxt);
|
||||
cl_assert_equal_i(0, exp.line_adds);
|
||||
cl_assert_equal_i(0, exp.line_dels);
|
||||
}
|
||||
|
||||
git_diff_list_free(diff);
|
||||
diff = NULL;
|
||||
memset(&exp, 0, sizeof(exp));
|
||||
|
||||
cl_git_rewritefile("issue_1397/crlf_file.txt", "first line\r\nsecond line modified\r\nboth with crlf");
|
||||
|
||||
cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts));
|
||||
|
||||
for (use_iterator = 0; use_iterator <= 1; use_iterator++) {
|
||||
memset(&exp, 0, sizeof(exp));
|
||||
|
||||
if (use_iterator)
|
||||
cl_git_pass(diff_foreach_via_iterator(
|
||||
diff, diff_file_cb, diff_hunk_cb, diff_line_cb, &exp));
|
||||
else
|
||||
cl_git_pass(git_diff_foreach(
|
||||
diff, diff_file_cb, diff_hunk_cb, diff_line_cb, &exp));
|
||||
|
||||
cl_assert_equal_i(1, exp.files);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_DELETED]);
|
||||
cl_assert_equal_i(1, exp.file_status[GIT_DELTA_MODIFIED]);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_IGNORED]);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_UNTRACKED]);
|
||||
|
||||
cl_assert_equal_i(1, exp.hunks);
|
||||
|
||||
cl_assert_equal_i(5, exp.lines);
|
||||
cl_assert_equal_i(3, exp.line_ctxt);
|
||||
cl_assert_equal_i(1, exp.line_adds);
|
||||
cl_assert_equal_i(1, exp.line_dels);
|
||||
}
|
||||
|
||||
git_diff_list_free(diff);
|
||||
}
|
||||
|
||||
void test_diff_workdir__to_tree_issue_1397(void)
|
||||
{
|
||||
/* grabbed a couple of commit oids from the history of the attr repo */
|
||||
const char *a_commit = "51883ad"; /* the current HEAD */
|
||||
git_tree *a;
|
||||
git_diff_options opts = GIT_DIFF_OPTIONS_INIT;
|
||||
git_diff_list *diff = NULL;
|
||||
git_diff_list *diff2 = NULL;
|
||||
diff_expects exp;
|
||||
int use_iterator;
|
||||
|
||||
g_repo = cl_git_sandbox_init("issue_1397");
|
||||
|
||||
set_core_autocrlf_to(true);
|
||||
|
||||
a = resolve_commit_oid_to_tree(g_repo, a_commit);
|
||||
|
||||
opts.context_lines = 3;
|
||||
opts.interhunk_lines = 1;
|
||||
|
||||
cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, a, &opts));
|
||||
|
||||
for (use_iterator = 0; use_iterator <= 1; use_iterator++) {
|
||||
memset(&exp, 0, sizeof(exp));
|
||||
|
||||
if (use_iterator)
|
||||
cl_git_pass(diff_foreach_via_iterator(
|
||||
diff, diff_file_cb, diff_hunk_cb, diff_line_cb, &exp));
|
||||
else
|
||||
cl_git_pass(git_diff_foreach(
|
||||
diff, diff_file_cb, diff_hunk_cb, diff_line_cb, &exp));
|
||||
|
||||
cl_assert_equal_i(0, exp.files);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_DELETED]);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_MODIFIED]);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_IGNORED]);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_UNTRACKED]);
|
||||
}
|
||||
|
||||
/* Since there is no git diff equivalent, let's just assume that the
|
||||
* text diffs produced by git_diff_foreach are accurate here. We will
|
||||
* do more apples-to-apples test comparison below.
|
||||
*/
|
||||
|
||||
git_diff_list_free(diff);
|
||||
diff = NULL;
|
||||
memset(&exp, 0, sizeof(exp));
|
||||
|
||||
/* This is a compatible emulation of "git diff <sha>" which looks like
|
||||
* a workdir to tree diff (even though it is not really). This is what
|
||||
* you would get from "git diff --name-status 26a125ee1bf"
|
||||
*/
|
||||
cl_git_pass(git_diff_tree_to_index(&diff, g_repo, a, NULL, &opts));
|
||||
cl_git_pass(git_diff_index_to_workdir(&diff2, g_repo, NULL, &opts));
|
||||
cl_git_pass(git_diff_merge(diff, diff2));
|
||||
git_diff_list_free(diff2);
|
||||
|
||||
for (use_iterator = 0; use_iterator <= 1; use_iterator++) {
|
||||
memset(&exp, 0, sizeof(exp));
|
||||
|
||||
if (use_iterator)
|
||||
cl_git_pass(diff_foreach_via_iterator(
|
||||
diff, diff_file_cb, diff_hunk_cb, diff_line_cb, &exp));
|
||||
else
|
||||
cl_git_pass(git_diff_foreach(
|
||||
diff, diff_file_cb, diff_hunk_cb, diff_line_cb, &exp));
|
||||
|
||||
cl_assert_equal_i(0, exp.files);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_ADDED]);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_DELETED]);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_MODIFIED]);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_IGNORED]);
|
||||
cl_assert_equal_i(0, exp.file_status[GIT_DELTA_UNTRACKED]);
|
||||
|
||||
cl_assert_equal_i(0, exp.hunks);
|
||||
|
||||
cl_assert_equal_i(0, exp.lines);
|
||||
cl_assert_equal_i(0, exp.line_ctxt);
|
||||
cl_assert_equal_i(0, exp.line_adds);
|
||||
cl_assert_equal_i(0, exp.line_dels);
|
||||
}
|
||||
|
||||
git_diff_list_free(diff);
|
||||
git_tree_free(a);
|
||||
}
|
||||
|
@ -251,6 +251,46 @@ void test_index_tests__add(void)
|
||||
git_repository_free(repo);
|
||||
}
|
||||
|
||||
void test_index_tests__add_issue_1397(void)
|
||||
{
|
||||
git_index *index;
|
||||
git_config *cfg;
|
||||
git_repository *repo;
|
||||
const git_index_entry *entry;
|
||||
git_oid id1;
|
||||
|
||||
cl_set_cleanup(&cleanup_myrepo, NULL);
|
||||
|
||||
repo = cl_git_sandbox_init("issue_1397");
|
||||
|
||||
cl_git_pass(git_repository_config(&cfg, repo));
|
||||
cl_git_pass(git_config_set_bool(cfg, "core.autocrlf", true));
|
||||
git_config_free(cfg);
|
||||
|
||||
/* Ensure we're the only guy in the room */
|
||||
cl_git_pass(git_repository_index(&index, repo));
|
||||
|
||||
/* Store the expected hash of the file/blob
|
||||
* This has been generated by executing the following
|
||||
* $ git hash-object crlf_file.txt
|
||||
*/
|
||||
cl_git_pass(git_oid_fromstr(&id1, "8312e0889a9cbab77c732b6bc39b51a683e3a318"));
|
||||
|
||||
/* Make sure the initial SHA-1 is correct */
|
||||
cl_assert((entry = git_index_get_bypath(index, "crlf_file.txt", 0)) != NULL);
|
||||
cl_assert(git_oid_cmp(&id1, &entry->oid) == 0);
|
||||
|
||||
/* Update the index */
|
||||
cl_git_pass(git_index_add_bypath(index, "crlf_file.txt"));
|
||||
|
||||
/* Check the new SHA-1 */
|
||||
cl_assert((entry = git_index_get_bypath(index, "crlf_file.txt", 0)) != NULL);
|
||||
cl_assert(git_oid_cmp(&id1, &entry->oid) == 0);
|
||||
|
||||
git_index_free(index);
|
||||
git_repository_free(repo);
|
||||
}
|
||||
|
||||
void test_index_tests__add_bypath_to_a_bare_repository_returns_EBAREPO(void)
|
||||
{
|
||||
git_repository *bare_repo;
|
||||
|
1
tests-clar/resources/issue_1397/.gitted/HEAD
Normal file
1
tests-clar/resources/issue_1397/.gitted/HEAD
Normal file
@ -0,0 +1 @@
|
||||
ref: refs/heads/master
|
6
tests-clar/resources/issue_1397/.gitted/config
Normal file
6
tests-clar/resources/issue_1397/.gitted/config
Normal file
@ -0,0 +1,6 @@
|
||||
[core]
|
||||
bare = false
|
||||
repositoryformatversion = 0
|
||||
filemode = false
|
||||
logallrefupdates = true
|
||||
ignorecase = true
|
BIN
tests-clar/resources/issue_1397/.gitted/index
Normal file
BIN
tests-clar/resources/issue_1397/.gitted/index
Normal file
Binary file not shown.
@ -0,0 +1,3 @@
|
||||
x<01>ÎQNÃ0€ažs
|
||||
¿£!'nâTBÓî°¸ŽC+Öe\Äv€ÿӯǾoÑËèfPƒ¦PL<50>8FΆ‘ÒÌ%ª_Ä‹b4æIÜ—tk²°Uœ¸êLdeIÁòd<3/˜|0¥šjÈää1Ö£ÃõÛ\Gßô³c…wÛe»]ô~úùߊ<C39F>ÁS
|
||||
)ÏGxE<78>èôÿqØsµÓUÚ‡8šÁmkæ~yIæ
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
||||
7f483a738f867e5b21c8f377d70311f011eb48b5
|
3
tests-clar/resources/issue_1397/crlf_file.txt
Normal file
3
tests-clar/resources/issue_1397/crlf_file.txt
Normal file
@ -0,0 +1,3 @@
|
||||
first line
|
||||
second line
|
||||
both with crlf
|
3
tests-clar/resources/issue_1397/some_other_crlf_file.txt
Normal file
3
tests-clar/resources/issue_1397/some_other_crlf_file.txt
Normal file
@ -0,0 +1,3 @@
|
||||
first line
|
||||
second line with some change
|
||||
both with crlf
|
@ -541,6 +541,21 @@ void test_status_worktree__line_endings_dont_count_as_changes_with_autocrlf(void
|
||||
cl_assert_equal_i(GIT_STATUS_CURRENT, status);
|
||||
}
|
||||
|
||||
void test_status_worktree__line_endings_dont_count_as_changes_with_autocrlf_issue_1397(void)
|
||||
{
|
||||
git_repository *repo = cl_git_sandbox_init("issue_1397");
|
||||
git_config *config;
|
||||
unsigned int status;
|
||||
|
||||
cl_git_pass(git_repository_config(&config, repo));
|
||||
cl_git_pass(git_config_set_bool(config, "core.autocrlf", true));
|
||||
git_config_free(config);
|
||||
|
||||
cl_git_pass(git_status_file(&status, repo, "crlf_file.txt"));
|
||||
|
||||
cl_assert_equal_i(GIT_STATUS_CURRENT, status);
|
||||
}
|
||||
|
||||
void test_status_worktree__conflicted_item(void)
|
||||
{
|
||||
git_repository *repo = cl_git_sandbox_init("status");
|
||||
|
Loading…
Reference in New Issue
Block a user