void test_filter_query__autocrlf_true_implies_crlf(void) { cl_repo_set_bool(g_repo, "core.autocrlf", true); cl_assert_equal_i(1, filter_for("not_in_gitattributes", "crlf")); cl_assert_equal_i(1, filter_for("foo.txt", "crlf")); cl_assert_equal_i(0, filter_for("foo.bin", "crlf")); cl_assert_equal_i(1, filter_for("foo.lf", "crlf")); cl_repo_set_bool(g_repo, "core.autocrlf", false); cl_assert_equal_i(0, filter_for("not_in_gitattributes", "crlf")); cl_assert_equal_i(1, filter_for("foo.txt", "crlf")); cl_assert_equal_i(0, filter_for("foo.bin", "crlf")); cl_assert_equal_i(1, filter_for("foo.lf", "crlf")); }
void test_checkout_index__honor_coresymlinks_setting_set_to_true(void) { git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT; cl_repo_set_bool(g_repo, "core.symlinks", true); opts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE; cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); #ifdef GIT_WIN32 check_file_contents("./testrepo/link_to_new.txt", "new.txt"); #else { char link_data[1024]; size_t link_size = 1024; link_size = p_readlink("./testrepo/link_to_new.txt", link_data, link_size); link_data[link_size] = '\0'; cl_assert_equal_i(link_size, strlen("new.txt")); cl_assert_equal_s(link_data, "new.txt"); check_file_contents("./testrepo/link_to_new.txt", "my new file\n"); } #endif }
void test_index_filemodes__explicit(void) { git_index *index; /* These tests should run and work everywhere, as the filemode is * given explicitly to git_index_add or git_index_add_frombuffer */ cl_repo_set_bool(g_repo, "core.filemode", false); cl_git_pass(git_repository_index(&index, g_repo)); /* Each of these tests keeps overwriting the same file in the index. */ /* 1 - add new 0644 entry */ add_entry_and_check_mode(index, true, GIT_FILEMODE_BLOB); /* 2 - add 0755 entry over existing 0644 */ add_entry_and_check_mode(index, true, GIT_FILEMODE_BLOB_EXECUTABLE); /* 3 - add 0644 entry over existing 0755 */ add_entry_and_check_mode(index, true, GIT_FILEMODE_BLOB); /* 4 - add 0755 buffer entry over existing 0644 */ add_entry_and_check_mode(index, false, GIT_FILEMODE_BLOB_EXECUTABLE); /* 5 - add 0644 buffer entry over existing 0755 */ add_entry_and_check_mode(index, false, GIT_FILEMODE_BLOB); git_index_free(index); }
void test_checkout_index__conflicts_honor_coreautocrlf(void) { #ifdef GIT_WIN32 git_index *index; git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; git_buf conflicting_buf = GIT_BUF_INIT; cl_git_pass(p_unlink("./testrepo/.gitattributes")); cl_repo_set_bool(g_repo, "core.autocrlf", true); cl_git_pass(git_repository_index(&index, g_repo)); add_conflict(index, "conflicting.txt"); cl_git_pass(git_index_write(index)); cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); cl_git_pass(git_futils_readbuffer(&conflicting_buf, "testrepo/conflicting.txt")); cl_assert(strcmp(conflicting_buf.ptr, "<<<<<<< ours\r\n" "this file is changed in master and branch\r\n" "=======\r\n" "this file is changed in branch and master\r\n" ">>>>>>> theirs\r\n") == 0); git_buf_free(&conflicting_buf); git_index_free(index); #endif }
void test_index_tests__add_issue_1397(void) { git_index *index; git_repository *repo; const git_index_entry *entry; git_oid id1; cl_set_cleanup(&cleanup_1397, NULL); repo = cl_git_sandbox_init("issue_1397"); cl_repo_set_bool(repo, "core.autocrlf", true); /* 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_equal_oid(&id1, &entry->id); /* 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_equal_oid(&id1, &entry->id); git_index_free(index); }
void test_checkout_crlf__autocrlf_true_index_size_is_filtered_size(void) { git_index *index; const git_index_entry *entry; git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; opts.checkout_strategy = GIT_CHECKOUT_FORCE; cl_repo_set_bool(g_repo, "core.autocrlf", true); git_checkout_head(g_repo, &opts); git_repository_index(&index, g_repo); cl_assert((entry = git_index_get_bypath(index, "all-lf", 0)) != NULL); if (GIT_EOL_NATIVE == GIT_EOL_LF) cl_assert_equal_sz(strlen(ALL_LF_TEXT_RAW), entry->file_size); else cl_assert_equal_sz(strlen(ALL_LF_TEXT_AS_CRLF), entry->file_size); cl_assert((entry = git_index_get_bypath(index, "all-crlf", 0)) != NULL); cl_assert_equal_sz(strlen(ALL_CRLF_TEXT_RAW), entry->file_size); git_index_free(index); }
void test_index_crlf__safecrlf_true_no_attrs(void) { cl_repo_set_bool(g_repo, "core.autocrlf", true); cl_repo_set_bool(g_repo, "core.safecrlf", true); cl_git_mkfile("crlf/newfile.txt", ALL_LF_TEXT_RAW); cl_git_pass(git_index_add_bypath(g_index, "newfile.txt")); cl_git_mkfile("crlf/newfile.txt", ALL_CRLF_TEXT_RAW); cl_git_pass(git_index_add_bypath(g_index, "newfile.txt")); cl_git_mkfile("crlf/newfile.txt", MORE_CRLF_TEXT_RAW); cl_git_fail(git_index_add_bypath(g_index, "newfile.txt")); cl_git_mkfile("crlf/newfile.txt", MORE_LF_TEXT_RAW); cl_git_fail(git_index_add_bypath(g_index, "newfile.txt")); }
void test_checkout_nasty__honors_core_protectntfs(void) { cl_repo_set_bool(repo, "core.protectNTFS", true); test_checkout_fails("refs/heads/dotgit_backslash_path", ".git/foobar"); test_checkout_fails("refs/heads/dotcapitalgit_backslash_path", ".GIT/foobar"); test_checkout_fails("refs/heads/dot_git_dot", ".git/foobar"); test_checkout_fails("refs/heads/git_tilde1", ".git/foobar"); }
void test_filter_crlf__initialize(void) { g_repo = cl_git_sandbox_init("crlf"); cl_git_mkfile("crlf/.gitattributes", "*.txt text\n*.bin binary\n*.crlf text eol=crlf\n*.lf text eol=lf\n"); cl_repo_set_bool(g_repo, "core.autocrlf", true); }
void test_status_worktree__line_endings_dont_count_as_changes_with_autocrlf_issue_1397(void) { git_repository *repo = cl_git_sandbox_init("issue_1397"); unsigned int status; cl_repo_set_bool(repo, "core.autocrlf", true); cl_git_pass(git_status_file(&status, repo, "crlf_file.txt")); cl_assert_equal_i(GIT_STATUS_CURRENT, status); }
void test_index_tests__honors_protect_filesystems(void) { git_repository *repo; p_mkdir("invalid", 0700); cl_git_pass(git_repository_init(&repo, "./invalid", 0)); cl_repo_set_bool(repo, "core.protectHFS", true); cl_repo_set_bool(repo, "core.protectNTFS", true); write_invalid_filename(repo, ".git./hello"); write_invalid_filename(repo, ".git\xe2\x80\xad/hello"); write_invalid_filename(repo, "git~1/hello"); write_invalid_filename(repo, ".git\xe2\x81\xaf/hello"); git_repository_free(repo); cl_fixture_cleanup("invalid"); }
void test_checkout_crlf__all_crlf_autocrlf_true(void) { git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; opts.checkout_strategy = GIT_CHECKOUT_FORCE; cl_repo_set_bool(g_repo, "core.autocrlf", true); git_checkout_head(g_repo, &opts); check_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_RAW); }
void test_refs_create__fsyncs_when_repo_config_set(void) { size_t create_count, compress_count; cl_repo_set_bool(g_repo, "core.fsyncObjectFiles", true); count_fsyncs(&create_count, &compress_count); cl_assert_equal_i(expected_fsyncs_create, create_count); cl_assert_equal_i(expected_fsyncs_compress, compress_count); }
void test_object_tree_write__protect_filesystems(void) { git_treebuilder *builder; git_oid bid; cl_git_pass(git_oid_fromstr(&bid, "fa49b077972391ad58037050f2a75f74e3671e92")); /* Ensure that (by default) we can write objects with funny names on * platforms that are not affected. */ cl_git_pass(git_treebuilder_new(&builder, g_repo, NULL)); #ifndef GIT_WIN32 cl_git_pass(git_treebuilder_insert(NULL, builder, ".git.", &bid, GIT_FILEMODE_BLOB)); cl_git_pass(git_treebuilder_insert(NULL, builder, "git~1", &bid, GIT_FILEMODE_BLOB)); #endif #ifndef __APPLE__ cl_git_pass(git_treebuilder_insert(NULL, builder, ".git\xef\xbb\xbf", &bid, GIT_FILEMODE_BLOB)); cl_git_pass(git_treebuilder_insert(NULL, builder, ".git\xe2\x80\xad", &bid, GIT_FILEMODE_BLOB)); #endif git_treebuilder_free(builder); /* Now turn on core.protectHFS and core.protectNTFS and validate that these * paths are rejected. */ cl_repo_set_bool(g_repo, "core.protectHFS", true); cl_repo_set_bool(g_repo, "core.protectNTFS", true); cl_git_pass(git_treebuilder_new(&builder, g_repo, NULL)); cl_git_fail(git_treebuilder_insert(NULL, builder, ".git.", &bid, GIT_FILEMODE_BLOB)); cl_git_fail(git_treebuilder_insert(NULL, builder, "git~1", &bid, GIT_FILEMODE_BLOB)); cl_git_fail(git_treebuilder_insert(NULL, builder, ".git\xef\xbb\xbf", &bid, GIT_FILEMODE_BLOB)); cl_git_fail(git_treebuilder_insert(NULL, builder, ".git\xe2\x80\xad", &bid, GIT_FILEMODE_BLOB)); git_treebuilder_free(builder); }
void test_checkout_index__honor_coresymlinks_setting_set_to_false(void) { git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT; cl_repo_set_bool(g_repo, "core.symlinks", false); opts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE; cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); check_file_contents("./testrepo/link_to_new.txt", "new.txt"); }
void test_checkout_crlf__detect_crlf_autocrlf_false(void) { git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT; opts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE; cl_repo_set_bool(g_repo, "core.autocrlf", false); git_checkout_head(g_repo, &opts); check_file_contents("./crlf/all-lf", ALL_LF_TEXT_RAW); check_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_RAW); }
void test_status_worktree__line_endings_dont_count_as_changes_with_autocrlf(void) { git_repository *repo = cl_git_sandbox_init("status"); unsigned int status; cl_repo_set_bool(repo, "core.autocrlf", true); cl_git_rewritefile("status/current_file", "current_file\r\n"); cl_git_pass(git_status_file(&status, repo, "current_file")); cl_assert_equal_i(GIT_STATUS_CURRENT, status); }
void test_checkout_crlf__more_crlf_autocrlf_true(void) { git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT; opts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE; cl_repo_set_bool(g_repo, "core.autocrlf", true); git_checkout_head(g_repo, &opts); if (GIT_EOL_NATIVE == GIT_EOL_LF) check_file_contents("./crlf/more-crlf", MORE_CRLF_TEXT_RAW); else check_file_contents("./crlf/more-crlf", MORE_CRLF_TEXT_AS_CRLF); }
void test_status_worktree__filemode_changes(void) { git_repository *repo = cl_git_sandbox_init("filemodes"); status_entry_counts counts; git_status_options opts = GIT_STATUS_OPTIONS_INIT; /* overwrite stored filemode with platform appropriate value */ if (cl_is_chmod_supported()) cl_repo_set_bool(repo, "core.filemode", true); else { int i; cl_repo_set_bool(repo, "core.filemode", false); /* won't trust filesystem mode diffs, so these will appear unchanged */ for (i = 0; i < filemode_count; ++i) if (filemode_statuses[i] == GIT_STATUS_WT_MODIFIED) filemode_statuses[i] = GIT_STATUS_CURRENT; } opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | GIT_STATUS_OPT_INCLUDE_IGNORED | GIT_STATUS_OPT_INCLUDE_UNMODIFIED; memset(&counts, 0, sizeof(counts)); counts.expected_entry_count = filemode_count; counts.expected_paths = filemode_paths; counts.expected_statuses = filemode_statuses; cl_git_pass( git_status_foreach_ext(repo, &opts, cb_status__normal, &counts) ); cl_assert_equal_i(counts.expected_entry_count, counts.entry_count); cl_assert_equal_i(0, counts.wrong_status_flags_count); cl_assert_equal_i(0, counts.wrong_sorted_path); }
void test_index_crlf__autocrlf_true_no_attrs(void) { const git_index_entry *entry; git_oid oid; cl_repo_set_bool(g_repo, "core.autocrlf", true); cl_git_mkfile("./crlf/newfile.txt", (GIT_EOL_NATIVE == GIT_EOL_CRLF) ? FILE_CONTENTS_CRLF : FILE_CONTENTS_LF); cl_git_pass(git_index_add_bypath(g_index, "newfile.txt")); entry = git_index_get_bypath(g_index, "newfile.txt", 0); cl_git_pass(git_oid_fromstr(&oid, FILE_OID_LF)); cl_assert(git_oid_cmp(&oid, &entry->id) == 0); }
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"); cl_repo_set_bool(g_repo, "core.autocrlf", true); opts.checkout_strategy = GIT_CHECKOUT_FORCE; cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); check_file_contents("./issue_1397/crlf_file.txt", "first line\r\nsecond line\r\nboth with crlf"); }
void test_checkout_index__honor_coreautocrlf_setting_set_to_true(void) { #ifdef GIT_WIN32 git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT; const char *expected_readme_text = "hey there\r\n"; cl_git_pass(p_unlink("./testrepo/.gitattributes")); cl_repo_set_bool(g_repo, "core.autocrlf", true); opts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE; cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); check_file_contents("./testrepo/README", expected_readme_text); #endif }
void test_checkout_crlf__autocrlf_true_no_attrs(void) { git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; opts.checkout_strategy = GIT_CHECKOUT_FORCE; cl_repo_set_bool(g_repo, "core.autocrlf", true); git_checkout_head(g_repo, &opts); if (GIT_EOL_NATIVE == GIT_EOL_CRLF) { check_file_contents("./crlf/all-lf", ALL_LF_TEXT_AS_CRLF); check_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_AS_CRLF); } else { check_file_contents("./crlf/all-lf", ALL_LF_TEXT_RAW); check_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_RAW); } }
void test_checkout_index__wont_notify_of_expected_line_ending_changes(void) { git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT; cl_git_pass(p_unlink("./testrepo/.gitattributes")); cl_repo_set_bool(g_repo, "core.autocrlf", true); cl_git_mkfile("./testrepo/new.txt", "my new file\r\n"); opts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE | GIT_CHECKOUT_ALLOW_CONFLICTS; opts.notify_flags = GIT_CHECKOUT_NOTIFY_CONFLICT; opts.notify_cb = dont_notify_cb; opts.notify_payload = NULL; cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); }
void test_status_worktree__line_endings_dont_count_as_changes_with_autocrlf(void) { git_repository *repo = cl_git_sandbox_init("status"); unsigned int status; cl_repo_set_bool(repo, "core.autocrlf", true); cl_git_rewritefile("status/current_file", "current_file\r\n"); cl_git_pass(git_status_file(&status, repo, "current_file")); /* stat data on file should no longer match stat cache, even though * file diff will be empty because of line-ending conversion - matches * the Git command-line behavior here. */ cl_assert_equal_i(GIT_STATUS_WT_MODIFIED, status); }
void test_checkout_index__honor_the_gitattributes_directives(void) { git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT; const char *attributes = "branch_file.txt text eol=crlf\n" "new.txt text eol=lf\n"; cl_git_mkfile("./testrepo/.gitattributes", attributes); cl_repo_set_bool(g_repo, "core.autocrlf", false); opts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE; cl_git_pass(git_checkout_index(g_repo, NULL, &opts)); check_file_contents("./testrepo/README", "hey there\n"); check_file_contents("./testrepo/new.txt", "my new file\n"); check_file_contents("./testrepo/branch_file.txt", "hi\r\nbye!\r\n"); }
void test_index_crlf__autocrlf_true_text_auto_attr(void) { const git_index_entry *entry; git_oid oid; cl_git_mkfile("./crlf/.gitattributes", "* text=auto\n"); cl_repo_set_bool(g_repo, "core.autocrlf", false); cl_git_mkfile("./crlf/newfile.txt", (GIT_EOL_NATIVE == GIT_EOL_CRLF) ? FILE_CONTENTS_CRLF : FILE_CONTENTS_LF); cl_git_pass(git_index_add_bypath(g_index, "newfile.txt")); entry = git_index_get_bypath(g_index, "newfile.txt", 0); cl_git_pass(git_oid_fromstr(&oid, FILE_OID_LF)); cl_assert_equal_oid(&oid, &entry->id); }
void test_checkout_crlf__autocrlf_false_text_auto_attr(void) { git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; opts.checkout_strategy = GIT_CHECKOUT_FORCE; cl_git_mkfile("./crlf/.gitattributes", "* text=auto\n"); cl_repo_set_bool(g_repo, "core.autocrlf", false); git_checkout_head(g_repo, &opts); if (GIT_EOL_NATIVE == GIT_EOL_CRLF) { check_file_contents("./crlf/all-lf", ALL_LF_TEXT_AS_CRLF); check_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_AS_CRLF); } else { check_file_contents("./crlf/all-lf", ALL_LF_TEXT_RAW); check_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_RAW); } }
void test_checkout_crlf__can_write_empty_file(void) { git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; opts.checkout_strategy = GIT_CHECKOUT_FORCE; cl_repo_set_bool(g_repo, "core.autocrlf", true); git_repository_set_head(g_repo, "refs/heads/empty-files"); git_checkout_head(g_repo, &opts); check_file_contents("./crlf/test1.txt", ""); if (GIT_EOL_NATIVE == GIT_EOL_LF) check_file_contents("./crlf/test2.txt", "test2.txt's content\n"); else check_file_contents("./crlf/test2.txt", "test2.txt's content\r\n"); check_file_contents("./crlf/test3.txt", ""); }
void test_odb_loose__fsync_obeys_repo_setting(void) { git_repository *repo; git_odb *odb; git_oid oid; cl_git_pass(git_repository_init(&repo, "test-objects", 1)); cl_git_pass(git_repository_odb__weakptr(&odb, repo)); cl_git_pass(git_odb_write(&oid, odb, "No fsync here\n", 14, GIT_OBJECT_BLOB)); cl_assert(p_fsync__cnt == 0); git_repository_free(repo); cl_git_pass(git_repository_open(&repo, "test-objects")); cl_repo_set_bool(repo, "core.fsyncObjectFiles", true); cl_git_pass(git_repository_odb__weakptr(&odb, repo)); cl_git_pass(git_odb_write(&oid, odb, "Now fsync\n", 10, GIT_OBJECT_BLOB)); cl_assert(p_fsync__cnt > 0); git_repository_free(repo); }