diff options
Diffstat (limited to 'tests-clar/status')
| -rw-r--r-- | tests-clar/status/ignore.c | 582 | ||||
| -rw-r--r-- | tests-clar/status/renames.c | 557 | ||||
| -rw-r--r-- | tests-clar/status/single.c | 45 | ||||
| -rw-r--r-- | tests-clar/status/status_data.h | 326 | ||||
| -rw-r--r-- | tests-clar/status/status_helpers.c | 101 | ||||
| -rw-r--r-- | tests-clar/status/status_helpers.h | 39 | ||||
| -rw-r--r-- | tests-clar/status/submodules.c | 223 | ||||
| -rw-r--r-- | tests-clar/status/worktree.c | 875 | ||||
| -rw-r--r-- | tests-clar/status/worktree_init.c | 341 |
9 files changed, 0 insertions, 3089 deletions
diff --git a/tests-clar/status/ignore.c b/tests-clar/status/ignore.c deleted file mode 100644 index acdc8fb58..000000000 --- a/tests-clar/status/ignore.c +++ /dev/null @@ -1,582 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "git2/attr.h" -#include "ignore.h" -#include "attr.h" -#include "status_helpers.h" - -static git_repository *g_repo = NULL; - -void test_status_ignore__initialize(void) -{ -} - -void test_status_ignore__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -void test_status_ignore__0(void) -{ - struct { - const char *path; - int expected; - } test_cases[] = { - /* pattern "ign" from .gitignore */ - { "file", 0 }, - { "ign", 1 }, - { "sub", 0 }, - { "sub/file", 0 }, - { "sub/ign", 1 }, - { "sub/ign/file", 1 }, - { "sub/ign/sub", 1 }, - { "sub/ign/sub/file", 1 }, - { "sub/sub", 0 }, - { "sub/sub/file", 0 }, - { "sub/sub/ign", 1 }, - { "sub/sub/sub", 0 }, - /* pattern "dir/" from .gitignore */ - { "dir", 1 }, - { "dir/", 1 }, - { "sub/dir", 1 }, - { "sub/dir/", 1 }, - { "sub/dir/file", 1 }, /* contained in ignored parent */ - { "sub/sub/dir", 0 }, /* dir is not actually a dir, but a file */ - { NULL, 0 } - }, *one_test; - - g_repo = cl_git_sandbox_init("attr"); - - for (one_test = test_cases; one_test->path != NULL; one_test++) { - int ignored; - cl_git_pass(git_status_should_ignore(&ignored, g_repo, one_test->path)); - cl_assert_(ignored == one_test->expected, one_test->path); - } - - /* confirm that ignore files were cached */ - cl_assert(git_attr_cache__is_cached(g_repo, 0, ".git/info/exclude")); - cl_assert(git_attr_cache__is_cached(g_repo, 0, ".gitignore")); -} - - -void test_status_ignore__1(void) -{ - int ignored; - - g_repo = cl_git_sandbox_init("attr"); - - cl_git_rewritefile("attr/.gitignore", "/*.txt\n/dir/\n"); - git_attr_cache_flush(g_repo); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "root_test4.txt")); - cl_assert(ignored); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "sub/subdir_test2.txt")); - cl_assert(!ignored); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "dir")); - cl_assert(ignored); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "dir/")); - cl_assert(ignored); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "sub/dir")); - cl_assert(!ignored); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "sub/dir/")); - cl_assert(!ignored); -} - - -void test_status_ignore__empty_repo_with_gitignore_rewrite(void) -{ - status_entry_single st; - int ignored; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_mkfile( - "empty_standard_repo/look-ma.txt", "I'm going to be ignored!"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(g_repo, cb_status__single, &st)); - cl_assert(st.count == 1); - cl_assert(st.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_file(&st.status, g_repo, "look-ma.txt")); - cl_assert(st.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "look-ma.txt")); - cl_assert(!ignored); - - cl_git_rewritefile("empty_standard_repo/.gitignore", "*.nomatch\n"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(g_repo, cb_status__single, &st)); - cl_assert(st.count == 2); - cl_assert(st.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_file(&st.status, g_repo, "look-ma.txt")); - cl_assert(st.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "look-ma.txt")); - cl_assert(!ignored); - - cl_git_rewritefile("empty_standard_repo/.gitignore", "*.txt\n"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(g_repo, cb_status__single, &st)); - cl_assert(st.count == 2); - cl_assert(st.status == GIT_STATUS_IGNORED); - - cl_git_pass(git_status_file(&st.status, g_repo, "look-ma.txt")); - cl_assert(st.status == GIT_STATUS_IGNORED); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "look-ma.txt")); - cl_assert(ignored); -} - -void test_status_ignore__ignore_pattern_contains_space(void) -{ - unsigned int flags; - const mode_t mode = 0777; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - cl_git_rewritefile("empty_standard_repo/.gitignore", "foo bar.txt\n"); - - cl_git_mkfile( - "empty_standard_repo/foo bar.txt", "I'm going to be ignored!"); - - cl_git_pass(git_status_file(&flags, g_repo, "foo bar.txt")); - cl_assert(flags == GIT_STATUS_IGNORED); - - cl_git_pass(git_futils_mkdir_r("empty_standard_repo/foo", NULL, mode)); - cl_git_mkfile("empty_standard_repo/foo/look-ma.txt", "I'm not going to be ignored!"); - - cl_git_pass(git_status_file(&flags, g_repo, "foo/look-ma.txt")); - cl_assert(flags == GIT_STATUS_WT_NEW); -} - -void test_status_ignore__ignore_pattern_ignorecase(void) -{ - unsigned int flags; - bool ignore_case; - git_index *index; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - cl_git_rewritefile("empty_standard_repo/.gitignore", "a.txt\n"); - - cl_git_mkfile("empty_standard_repo/A.txt", "Differs in case"); - - cl_git_pass(git_repository_index(&index, g_repo)); - ignore_case = (git_index_caps(index) & GIT_INDEXCAP_IGNORE_CASE) != 0; - git_index_free(index); - - cl_git_pass(git_status_file(&flags, g_repo, "A.txt")); - cl_assert(flags == ignore_case ? GIT_STATUS_IGNORED : GIT_STATUS_WT_NEW); -} - -void test_status_ignore__subdirectories(void) -{ - status_entry_single st; - int ignored; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_mkfile( - "empty_standard_repo/ignore_me", "I'm going to be ignored!"); - - cl_git_rewritefile("empty_standard_repo/.gitignore", "ignore_me\n"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(g_repo, cb_status__single, &st)); - cl_assert_equal_i(2, st.count); - cl_assert(st.status == GIT_STATUS_IGNORED); - - cl_git_pass(git_status_file(&st.status, g_repo, "ignore_me")); - cl_assert(st.status == GIT_STATUS_IGNORED); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "ignore_me")); - cl_assert(ignored); - - /* I've changed libgit2 so that the behavior here now differs from - * core git but seems to make more sense. In core git, the following - * items are skipped completed, even if --ignored is passed to status. - * It you mirror these steps and run "git status -uall --ignored" then - * you will not see "test/ignore_me/" in the results. - * - * However, we had a couple reports of this as a bug, plus there is a - * similar circumstance where we were differing for core git when you - * used a rooted path for an ignore, so I changed this behavior. - */ - cl_git_pass(git_futils_mkdir_r( - "empty_standard_repo/test/ignore_me", NULL, 0775)); - cl_git_mkfile( - "empty_standard_repo/test/ignore_me/file", "I'm going to be ignored!"); - cl_git_mkfile( - "empty_standard_repo/test/ignore_me/file2", "Me, too!"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(g_repo, cb_status__single, &st)); - cl_assert_equal_i(3, st.count); - - cl_git_pass(git_status_file(&st.status, g_repo, "test/ignore_me/file")); - cl_assert(st.status == GIT_STATUS_IGNORED); - - cl_git_pass( - git_status_should_ignore(&ignored, g_repo, "test/ignore_me/file")); - cl_assert(ignored); -} - -void test_status_ignore__subdirectories_recursion(void) -{ - /* Let's try again with recursing into ignored dirs turned on */ - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts; - static const char *paths_r[] = { - ".gitignore", - "ignore_also/file", - "ignore_me", - "test/ignore_me/and_me/file", - "test/ignore_me/file", - "test/ignore_me/file2", - }; - static const unsigned int statuses_r[] = { - GIT_STATUS_WT_NEW, - GIT_STATUS_IGNORED, - GIT_STATUS_IGNORED, - GIT_STATUS_IGNORED, - GIT_STATUS_IGNORED, - GIT_STATUS_IGNORED, - }; - static const char *paths_nr[] = { - ".gitignore", - "ignore_also/", - "ignore_me", - "test/ignore_me/", - }; - static const unsigned int statuses_nr[] = { - GIT_STATUS_WT_NEW, - GIT_STATUS_IGNORED, - GIT_STATUS_IGNORED, - GIT_STATUS_IGNORED, - }; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_rewritefile("empty_standard_repo/.gitignore", "ignore_me\n/ignore_also\n"); - - cl_git_mkfile( - "empty_standard_repo/ignore_me", "I'm going to be ignored!"); - cl_git_pass(git_futils_mkdir_r( - "empty_standard_repo/test/ignore_me", NULL, 0775)); - cl_git_mkfile( - "empty_standard_repo/test/ignore_me/file", "I'm going to be ignored!"); - cl_git_mkfile( - "empty_standard_repo/test/ignore_me/file2", "Me, too!"); - cl_git_pass(git_futils_mkdir_r( - "empty_standard_repo/test/ignore_me/and_me", NULL, 0775)); - cl_git_mkfile( - "empty_standard_repo/test/ignore_me/and_me/file", "Deeply ignored"); - cl_git_pass(git_futils_mkdir_r( - "empty_standard_repo/ignore_also", NULL, 0775)); - cl_git_mkfile( - "empty_standard_repo/ignore_also/file", "I'm going to be ignored!"); - - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = 6; - counts.expected_paths = paths_r; - counts.expected_statuses = statuses_r; - - opts.flags = GIT_STATUS_OPT_DEFAULTS | GIT_STATUS_OPT_RECURSE_IGNORED_DIRS; - - cl_git_pass(git_status_foreach_ext( - g_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); - - - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = 4; - counts.expected_paths = paths_nr; - counts.expected_statuses = statuses_nr; - - opts.flags = GIT_STATUS_OPT_DEFAULTS; - - cl_git_pass(git_status_foreach_ext( - g_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_status_ignore__adding_internal_ignores(void) -{ - int ignored; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "one.txt")); - cl_assert(!ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "two.bar")); - cl_assert(!ignored); - - cl_git_pass(git_ignore_add_rule(g_repo, "*.nomatch\n")); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "one.txt")); - cl_assert(!ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "two.bar")); - cl_assert(!ignored); - - cl_git_pass(git_ignore_add_rule(g_repo, "*.txt\n")); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "one.txt")); - cl_assert(ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "two.bar")); - cl_assert(!ignored); - - cl_git_pass(git_ignore_add_rule(g_repo, "*.bar\n")); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "one.txt")); - cl_assert(ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "two.bar")); - cl_assert(ignored); - - cl_git_pass(git_ignore_clear_internal_rules(g_repo)); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "one.txt")); - cl_assert(!ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "two.bar")); - cl_assert(!ignored); - - cl_git_pass(git_ignore_add_rule( - g_repo, "multiple\n*.rules\n# comment line\n*.bar\n")); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "one.txt")); - cl_assert(!ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "two.bar")); - cl_assert(ignored); -} - -void test_status_ignore__add_internal_as_first_thing(void) -{ - int ignored; - const char *add_me = "\n#################\n## Eclipse\n#################\n\n*.pydevproject\n.project\n.metadata\nbin/\ntmp/\n*.tmp\n\n"; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_pass(git_ignore_add_rule(g_repo, add_me)); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "one.tmp")); - cl_assert(ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "two.bar")); - cl_assert(!ignored); -} - -void test_status_ignore__internal_ignores_inside_deep_paths(void) -{ - int ignored; - const char *add_me = "Debug\nthis/is/deep\npatterned*/dir\n"; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_pass(git_ignore_add_rule(g_repo, add_me)); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "Debug")); - cl_assert(ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "and/Debug")); - cl_assert(ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "really/Debug/this/file")); - cl_assert(ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "Debug/what/I/say")); - cl_assert(ignored); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "and/NoDebug")); - cl_assert(!ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "NoDebug/this")); - cl_assert(!ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "please/NoDebug/this")); - cl_assert(!ignored); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "this/is/deep")); - cl_assert(ignored); - /* pattern containing slash gets FNM_PATHNAME so all slashes must match */ - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "and/this/is/deep")); - cl_assert(!ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "this/is/deep/too")); - cl_assert(ignored); - /* pattern containing slash gets FNM_PATHNAME so all slashes must match */ - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "but/this/is/deep/and/ignored")); - cl_assert(!ignored); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "this/is/not/deep")); - cl_assert(!ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "is/this/not/as/deep")); - cl_assert(!ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "this/is/deepish")); - cl_assert(!ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "xthis/is/deep")); - cl_assert(!ignored); -} - -void test_status_ignore__automatically_ignore_bad_files(void) -{ - int ignored; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, ".git")); - cl_assert(ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "this/file/.")); - cl_assert(ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "path/../funky")); - cl_assert(ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "path/whatever.c")); - cl_assert(!ignored); - - cl_git_pass(git_ignore_add_rule(g_repo, "*.c\n")); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, ".git")); - cl_assert(ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "this/file/.")); - cl_assert(ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "path/../funky")); - cl_assert(ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "path/whatever.c")); - cl_assert(ignored); - - cl_git_pass(git_ignore_clear_internal_rules(g_repo)); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, ".git")); - cl_assert(ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "this/file/.")); - cl_assert(ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "path/../funky")); - cl_assert(ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "path/whatever.c")); - cl_assert(!ignored); -} - -void test_status_ignore__filenames_with_special_prefixes_do_not_interfere_with_status_retrieval(void) -{ - status_entry_single st; - char *test_cases[] = { - "!file", - "#blah", - "[blah]", - "[attr]", - "[attr]blah", - NULL - }; - int i; - - for (i = 0; *(test_cases + i) != NULL; i++) { - git_buf file = GIT_BUF_INIT; - char *file_name = *(test_cases + i); - git_repository *repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_pass(git_buf_joinpath(&file, "empty_standard_repo", file_name)); - cl_git_mkfile(git_buf_cstr(&file), "Please don't ignore me!"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &st)); - cl_assert(st.count == 1); - cl_assert(st.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_file(&st.status, repo, file_name)); - cl_assert(st.status == GIT_STATUS_WT_NEW); - - cl_git_sandbox_cleanup(); - git_buf_free(&file); - } -} - -void test_status_ignore__issue_1766_negated_ignores(void) -{ - int ignored = 0; - unsigned int status; - - g_repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_pass(git_futils_mkdir_r( - "empty_standard_repo/a", NULL, 0775)); - cl_git_mkfile( - "empty_standard_repo/a/.gitignore", "*\n!.gitignore\n"); - cl_git_mkfile( - "empty_standard_repo/a/ignoreme", "I should be ignored\n"); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "a/.gitignore")); - cl_assert(!ignored); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "a/ignoreme")); - cl_assert(ignored); - - cl_git_pass(git_futils_mkdir_r( - "empty_standard_repo/b", NULL, 0775)); - cl_git_mkfile( - "empty_standard_repo/b/.gitignore", "*\n!.gitignore\n"); - cl_git_mkfile( - "empty_standard_repo/b/ignoreme", "I should be ignored\n"); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "b/.gitignore")); - cl_assert(!ignored); - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "b/ignoreme")); - cl_assert(ignored); - - /* shouldn't have changed results from first couple either */ - - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "a/.gitignore")); - cl_assert(!ignored); - cl_git_pass(git_status_should_ignore(&ignored, g_repo, "a/ignoreme")); - cl_assert(ignored); - - /* status should find the two ignore files and nothing else */ - - cl_git_pass(git_status_file(&status, g_repo, "a/.gitignore")); - cl_assert_equal_i(GIT_STATUS_WT_NEW, (int)status); - - cl_git_pass(git_status_file(&status, g_repo, "a/ignoreme")); - cl_assert_equal_i(GIT_STATUS_IGNORED, (int)status); - - cl_git_pass(git_status_file(&status, g_repo, "b/.gitignore")); - cl_assert_equal_i(GIT_STATUS_WT_NEW, (int)status); - - cl_git_pass(git_status_file(&status, g_repo, "b/ignoreme")); - cl_assert_equal_i(GIT_STATUS_IGNORED, (int)status); - - { - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts; - static const char *paths[] = { - "a/.gitignore", - "a/ignoreme", - "b/.gitignore", - "b/ignoreme", - }; - static const unsigned int statuses[] = { - GIT_STATUS_WT_NEW, - GIT_STATUS_IGNORED, - GIT_STATUS_WT_NEW, - GIT_STATUS_IGNORED, - }; - - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = 4; - counts.expected_paths = paths; - counts.expected_statuses = statuses; - - opts.flags = GIT_STATUS_OPT_DEFAULTS; - - cl_git_pass(git_status_foreach_ext( - g_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); - } -} - diff --git a/tests-clar/status/renames.c b/tests-clar/status/renames.c deleted file mode 100644 index 16fd02676..000000000 --- a/tests-clar/status/renames.c +++ /dev/null @@ -1,557 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "path.h" -#include "posix.h" -#include "status_helpers.h" -#include "util.h" -#include "status.h" - -static git_repository *g_repo = NULL; - -void test_status_renames__initialize(void) -{ - g_repo = cl_git_sandbox_init("renames"); - - cl_repo_set_bool(g_repo, "core.autocrlf", false); -} - -void test_status_renames__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -static void rename_file(git_repository *repo, const char *oldname, const char *newname) -{ - git_buf oldpath = GIT_BUF_INIT, newpath = GIT_BUF_INIT; - - git_buf_joinpath(&oldpath, git_repository_workdir(repo), oldname); - git_buf_joinpath(&newpath, git_repository_workdir(repo), newname); - - cl_git_pass(p_rename(oldpath.ptr, newpath.ptr)); - - git_buf_free(&oldpath); - git_buf_free(&newpath); -} - -static void rename_and_edit_file(git_repository *repo, const char *oldname, const char *newname) -{ - git_buf oldpath = GIT_BUF_INIT, newpath = GIT_BUF_INIT; - - git_buf_joinpath(&oldpath, git_repository_workdir(repo), oldname); - git_buf_joinpath(&newpath, git_repository_workdir(repo), newname); - - cl_git_pass(p_rename(oldpath.ptr, newpath.ptr)); - cl_git_append2file(newpath.ptr, "Added at the end to keep similarity!"); - - git_buf_free(&oldpath); - git_buf_free(&newpath); -} - -struct status_entry { - git_status_t status; - const char *oldname; - const char *newname; -}; - -static void test_status( - git_status_list *status_list, - struct status_entry *expected_list, - size_t expected_len) -{ - const git_status_entry *actual; - const struct status_entry *expected; - const char *oldname, *newname; - size_t i; - - cl_assert_equal_sz(expected_len, git_status_list_entrycount(status_list)); - - for (i = 0; i < expected_len; i++) { - actual = git_status_byindex(status_list, i); - expected = &expected_list[i]; - - oldname = actual->head_to_index ? actual->head_to_index->old_file.path : - actual->index_to_workdir ? actual->index_to_workdir->old_file.path : NULL; - - newname = actual->index_to_workdir ? actual->index_to_workdir->new_file.path : - actual->head_to_index ? actual->head_to_index->new_file.path : NULL; - - cl_assert_equal_i_fmt(expected->status, actual->status, "%04x"); - - if (oldname) - cl_assert(git__strcmp(oldname, expected->oldname) == 0); - else - cl_assert(expected->oldname == NULL); - - if (newname) - cl_assert(git__strcmp(newname, expected->newname) == 0); - else - cl_assert(expected->newname == NULL); - } -} - -void test_status_renames__head2index_one(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_INDEX_RENAMED, "ikeepsix.txt", "newname.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - - cl_git_pass(git_repository_index(&index, g_repo)); - - rename_file(g_repo, "ikeepsix.txt", "newname.txt"); - - cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_add_bypath(index, "newname.txt")); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - test_status(statuslist, expected, 1); - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__head2index_two(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED, - "sixserving.txt", "aaa.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED, - "untimely.txt", "bbb.txt" }, - { GIT_STATUS_INDEX_RENAMED, "songof7cities.txt", "ccc.txt" }, - { GIT_STATUS_INDEX_RENAMED, "ikeepsix.txt", "ddd.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - - cl_git_pass(git_repository_index(&index, g_repo)); - - rename_file(g_repo, "ikeepsix.txt", "ddd.txt"); - rename_and_edit_file(g_repo, "sixserving.txt", "aaa.txt"); - rename_file(g_repo, "songof7cities.txt", "ccc.txt"); - rename_and_edit_file(g_repo, "untimely.txt", "bbb.txt"); - - cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_remove_bypath(index, "sixserving.txt")); - cl_git_pass(git_index_remove_bypath(index, "songof7cities.txt")); - cl_git_pass(git_index_remove_bypath(index, "untimely.txt")); - cl_git_pass(git_index_add_bypath(index, "ddd.txt")); - cl_git_pass(git_index_add_bypath(index, "aaa.txt")); - cl_git_pass(git_index_add_bypath(index, "ccc.txt")); - cl_git_pass(git_index_add_bypath(index, "bbb.txt")); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - test_status(statuslist, expected, 4); - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__head2index_no_rename_from_rewrite(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_INDEX_MODIFIED, "ikeepsix.txt", "ikeepsix.txt" }, - { GIT_STATUS_INDEX_MODIFIED, "sixserving.txt", "sixserving.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - - cl_git_pass(git_repository_index(&index, g_repo)); - - rename_file(g_repo, "ikeepsix.txt", "_temp_.txt"); - rename_file(g_repo, "sixserving.txt", "ikeepsix.txt"); - rename_file(g_repo, "_temp_.txt", "sixserving.txt"); - - cl_git_pass(git_index_add_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_add_bypath(index, "sixserving.txt")); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - test_status(statuslist, expected, 2); - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__head2index_rename_from_rewrite(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_INDEX_RENAMED, "sixserving.txt", "ikeepsix.txt" }, - { GIT_STATUS_INDEX_RENAMED, "ikeepsix.txt", "sixserving.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - opts.flags |= GIT_STATUS_OPT_RENAMES_FROM_REWRITES; - - cl_git_pass(git_repository_index(&index, g_repo)); - - rename_file(g_repo, "ikeepsix.txt", "_temp_.txt"); - rename_file(g_repo, "sixserving.txt", "ikeepsix.txt"); - rename_file(g_repo, "_temp_.txt", "sixserving.txt"); - - cl_git_pass(git_index_add_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_add_bypath(index, "sixserving.txt")); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - test_status(statuslist, expected, 2); - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__index2workdir_one(void) -{ - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_WT_RENAMED, "ikeepsix.txt", "newname.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - - rename_file(g_repo, "ikeepsix.txt", "newname.txt"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - test_status(statuslist, expected, 1); - git_status_list_free(statuslist); -} - -void test_status_renames__index2workdir_two(void) -{ - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_WT_RENAMED | GIT_STATUS_WT_MODIFIED, - "sixserving.txt", "aaa.txt" }, - { GIT_STATUS_WT_RENAMED | GIT_STATUS_WT_MODIFIED, - "untimely.txt", "bbb.txt" }, - { GIT_STATUS_WT_RENAMED, "songof7cities.txt", "ccc.txt" }, - { GIT_STATUS_WT_RENAMED, "ikeepsix.txt", "ddd.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - - rename_file(g_repo, "ikeepsix.txt", "ddd.txt"); - rename_and_edit_file(g_repo, "sixserving.txt", "aaa.txt"); - rename_file(g_repo, "songof7cities.txt", "ccc.txt"); - rename_and_edit_file(g_repo, "untimely.txt", "bbb.txt"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - test_status(statuslist, expected, 4); - git_status_list_free(statuslist); -} - -void test_status_renames__index2workdir_rename_from_rewrite(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_WT_RENAMED, "sixserving.txt", "ikeepsix.txt" }, - { GIT_STATUS_WT_RENAMED, "ikeepsix.txt", "sixserving.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - opts.flags |= GIT_STATUS_OPT_RENAMES_FROM_REWRITES; - - cl_git_pass(git_repository_index(&index, g_repo)); - - rename_file(g_repo, "ikeepsix.txt", "_temp_.txt"); - rename_file(g_repo, "sixserving.txt", "ikeepsix.txt"); - rename_file(g_repo, "_temp_.txt", "sixserving.txt"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - test_status(statuslist, expected, 2); - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__both_one(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, - "ikeepsix.txt", "newname-workdir.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - - cl_git_pass(git_repository_index(&index, g_repo)); - - rename_file(g_repo, "ikeepsix.txt", "newname-index.txt"); - - cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_add_bypath(index, "newname-index.txt")); - cl_git_pass(git_index_write(index)); - - rename_file(g_repo, "newname-index.txt", "newname-workdir.txt"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - test_status(statuslist, expected, 1); - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__both_two(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED | - GIT_STATUS_WT_RENAMED | GIT_STATUS_WT_MODIFIED, - "ikeepsix.txt", "ikeepsix-both.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED, - "sixserving.txt", "sixserving-index.txt" }, - { GIT_STATUS_WT_RENAMED | GIT_STATUS_WT_MODIFIED, - "songof7cities.txt", "songof7cities-workdir.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, - "untimely.txt", "untimely-both.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - - cl_git_pass(git_repository_index(&index, g_repo)); - - rename_and_edit_file(g_repo, "ikeepsix.txt", "ikeepsix-index.txt"); - rename_and_edit_file(g_repo, "sixserving.txt", "sixserving-index.txt"); - rename_file(g_repo, "untimely.txt", "untimely-index.txt"); - - cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_remove_bypath(index, "sixserving.txt")); - cl_git_pass(git_index_remove_bypath(index, "untimely.txt")); - cl_git_pass(git_index_add_bypath(index, "ikeepsix-index.txt")); - cl_git_pass(git_index_add_bypath(index, "sixserving-index.txt")); - cl_git_pass(git_index_add_bypath(index, "untimely-index.txt")); - cl_git_pass(git_index_write(index)); - - rename_and_edit_file(g_repo, "ikeepsix-index.txt", "ikeepsix-both.txt"); - rename_and_edit_file(g_repo, "songof7cities.txt", "songof7cities-workdir.txt"); - rename_file(g_repo, "untimely-index.txt", "untimely-both.txt"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - test_status(statuslist, expected, 4); - git_status_list_free(statuslist); - - git_index_free(index); -} - - -void test_status_renames__both_rename_from_rewrite(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, - "songof7cities.txt", "ikeepsix.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, - "ikeepsix.txt", "sixserving.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, - "sixserving.txt", "songof7cities.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - opts.flags |= GIT_STATUS_OPT_RENAMES_FROM_REWRITES; - - cl_git_pass(git_repository_index(&index, g_repo)); - - rename_file(g_repo, "ikeepsix.txt", "_temp_.txt"); - rename_file(g_repo, "sixserving.txt", "ikeepsix.txt"); - rename_file(g_repo, "songof7cities.txt", "sixserving.txt"); - rename_file(g_repo, "_temp_.txt", "songof7cities.txt"); - - cl_git_pass(git_index_add_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_add_bypath(index, "sixserving.txt")); - cl_git_pass(git_index_add_bypath(index, "songof7cities.txt")); - cl_git_pass(git_index_write(index)); - - rename_file(g_repo, "songof7cities.txt", "_temp_.txt"); - rename_file(g_repo, "ikeepsix.txt", "songof7cities.txt"); - rename_file(g_repo, "sixserving.txt", "ikeepsix.txt"); - rename_file(g_repo, "_temp_.txt", "sixserving.txt"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - test_status(statuslist, expected, 3); - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__rewrites_only_for_renames(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - struct status_entry expected[] = { - { GIT_STATUS_WT_MODIFIED, "ikeepsix.txt", "ikeepsix.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - opts.flags |= GIT_STATUS_OPT_RENAMES_FROM_REWRITES; - - cl_git_pass(git_repository_index(&index, g_repo)); - - cl_git_rewritefile("renames/ikeepsix.txt", - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n" \ - "This is enough content for the file to be rewritten.\n"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - test_status(statuslist, expected, 1); - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__both_casechange_one(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - int index_caps; - struct status_entry expected_icase[] = { - { GIT_STATUS_INDEX_RENAMED, - "ikeepsix.txt", "IKeepSix.txt" }, - }; - struct status_entry expected_case[] = { - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, - "ikeepsix.txt", "IKEEPSIX.txt" }, - }; - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - - cl_git_pass(git_repository_index(&index, g_repo)); - index_caps = git_index_caps(index); - - rename_file(g_repo, "ikeepsix.txt", "IKeepSix.txt"); - - cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_add_bypath(index, "IKeepSix.txt")); - cl_git_pass(git_index_write(index)); - - /* on a case-insensitive file system, this change won't matter. - * on a case-sensitive one, it will. - */ - rename_file(g_repo, "IKeepSix.txt", "IKEEPSIX.txt"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - - test_status(statuslist, (index_caps & GIT_INDEXCAP_IGNORE_CASE) ? - expected_icase : expected_case, 1); - - git_status_list_free(statuslist); - - git_index_free(index); -} - -void test_status_renames__both_casechange_two(void) -{ - git_index *index; - git_status_list *statuslist; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - int index_caps; - struct status_entry expected_icase[] = { - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED | - GIT_STATUS_WT_MODIFIED, - "ikeepsix.txt", "IKeepSix.txt" }, - { GIT_STATUS_INDEX_MODIFIED, - "sixserving.txt", "sixserving.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_MODIFIED, - "songof7cities.txt", "songof7.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, - "untimely.txt", "untimeliest.txt" } - }; - struct status_entry expected_case[] = { - { GIT_STATUS_INDEX_RENAMED | - GIT_STATUS_WT_MODIFIED | GIT_STATUS_WT_RENAMED, - "songof7cities.txt", "SONGOF7.txt" }, - { GIT_STATUS_INDEX_MODIFIED | GIT_STATUS_WT_RENAMED, - "sixserving.txt", "SixServing.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED | - GIT_STATUS_WT_RENAMED | GIT_STATUS_WT_MODIFIED, - "ikeepsix.txt", "ikeepsix.txt" }, - { GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, - "untimely.txt", "untimeliest.txt" } - }; - - opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED; - opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; - opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR; - - cl_git_pass(git_repository_index(&index, g_repo)); - index_caps = git_index_caps(index); - - rename_and_edit_file(g_repo, "ikeepsix.txt", "IKeepSix.txt"); - rename_and_edit_file(g_repo, "sixserving.txt", "sixserving.txt"); - rename_file(g_repo, "songof7cities.txt", "songof7.txt"); - rename_file(g_repo, "untimely.txt", "untimelier.txt"); - - cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt")); - cl_git_pass(git_index_remove_bypath(index, "sixserving.txt")); - cl_git_pass(git_index_remove_bypath(index, "songof7cities.txt")); - cl_git_pass(git_index_remove_bypath(index, "untimely.txt")); - cl_git_pass(git_index_add_bypath(index, "IKeepSix.txt")); - cl_git_pass(git_index_add_bypath(index, "sixserving.txt")); - cl_git_pass(git_index_add_bypath(index, "songof7.txt")); - cl_git_pass(git_index_add_bypath(index, "untimelier.txt")); - cl_git_pass(git_index_write(index)); - - rename_and_edit_file(g_repo, "IKeepSix.txt", "ikeepsix.txt"); - rename_file(g_repo, "sixserving.txt", "SixServing.txt"); - rename_and_edit_file(g_repo, "songof7.txt", "SONGOF7.txt"); - rename_file(g_repo, "untimelier.txt", "untimeliest.txt"); - - cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts)); - - test_status(statuslist, (index_caps & GIT_INDEXCAP_IGNORE_CASE) ? - expected_icase : expected_case, 4); - - git_status_list_free(statuslist); - - git_index_free(index); -} diff --git a/tests-clar/status/single.c b/tests-clar/status/single.c deleted file mode 100644 index 292c9120a..000000000 --- a/tests-clar/status/single.c +++ /dev/null @@ -1,45 +0,0 @@ -#include "clar_libgit2.h" -#include "posix.h" - -static void -cleanup__remove_file(void *_file) -{ - cl_must_pass(p_unlink((char *)_file)); -} - -/* test retrieving OID from a file apart from the ODB */ -void test_status_single__hash_single_file(void) -{ - static const char file_name[] = "new_file"; - static const char file_contents[] = "new_file\n"; - static const char file_hash[] = "d4fa8600b4f37d7516bef4816ae2c64dbf029e3a"; - - git_oid expected_id, actual_id; - - /* initialization */ - git_oid_fromstr(&expected_id, file_hash); - cl_git_mkfile(file_name, file_contents); - cl_set_cleanup(&cleanup__remove_file, (void *)file_name); - - cl_git_pass(git_odb_hashfile(&actual_id, file_name, GIT_OBJ_BLOB)); - cl_assert(git_oid_cmp(&expected_id, &actual_id) == 0); -} - -/* test retrieving OID from an empty file apart from the ODB */ -void test_status_single__hash_single_empty_file(void) -{ - static const char file_name[] = "new_empty_file"; - static const char file_contents[] = ""; - static const char file_hash[] = "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"; - - git_oid expected_id, actual_id; - - /* initialization */ - git_oid_fromstr(&expected_id, file_hash); - cl_git_mkfile(file_name, file_contents); - cl_set_cleanup(&cleanup__remove_file, (void *)file_name); - - cl_git_pass(git_odb_hashfile(&actual_id, file_name, GIT_OBJ_BLOB)); - cl_assert(git_oid_cmp(&expected_id, &actual_id) == 0); -} - diff --git a/tests-clar/status/status_data.h b/tests-clar/status/status_data.h deleted file mode 100644 index 8ad4235fd..000000000 --- a/tests-clar/status/status_data.h +++ /dev/null @@ -1,326 +0,0 @@ -#include "status_helpers.h" - -// A utf-8 string with 83 characters, but 249 bytes. -static const char *longname = "\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97\xe5\x8f\x97"; - - -/* entries for a plain copy of tests/resources/status */ - -static const char *entry_paths0[] = { - "file_deleted", - "ignored_file", - "modified_file", - "new_file", - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file", - "staged_new_file", - "staged_new_file_deleted_file", - "staged_new_file_modified_file", - - "subdir/deleted_file", - "subdir/modified_file", - "subdir/new_file", - - "\xe8\xbf\x99", -}; - -static const unsigned int entry_statuses0[] = { - GIT_STATUS_WT_DELETED, - GIT_STATUS_IGNORED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_INDEX_MODIFIED | GIT_STATUS_WT_DELETED, - GIT_STATUS_INDEX_MODIFIED | GIT_STATUS_WT_MODIFIED, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_INDEX_DELETED | GIT_STATUS_WT_NEW, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_INDEX_NEW | GIT_STATUS_WT_DELETED, - GIT_STATUS_INDEX_NEW | GIT_STATUS_WT_MODIFIED, - - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - - GIT_STATUS_WT_NEW, -}; - -static const int entry_count0 = 16; - -/* entries for a copy of tests/resources/status with all content - * deleted from the working directory - */ - -static const char *entry_paths2[] = { - "current_file", - "file_deleted", - "modified_file", - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file", - "staged_new_file", - "staged_new_file_deleted_file", - "staged_new_file_modified_file", - "subdir.txt", - "subdir/current_file", - "subdir/deleted_file", - "subdir/modified_file", -}; - -static const unsigned int entry_statuses2[] = { - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, -}; - -static const int entry_count2 = 15; - -/* entries for a copy of tests/resources/status with some mods */ - -static const char *entry_paths3_icase[] = { - ".HEADER", - "42-is-not-prime.sigh", - "current_file", - "current_file/", - "file_deleted", - "ignored_file", - "modified_file", - "new_file", - "README.md", - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file", - "staged_new_file", - "staged_new_file_deleted_file", - "staged_new_file_modified_file", - "subdir", - "subdir/current_file", - "subdir/deleted_file", - "subdir/modified_file", - "\xe8\xbf\x99", -}; - -static const unsigned int entry_statuses3_icase[] = { - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_IGNORED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_WT_NEW | GIT_STATUS_INDEX_DELETED, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_NEW, -}; - -static const char *entry_paths3[] = { - ".HEADER", - "42-is-not-prime.sigh", - "README.md", - "current_file", - "current_file/", - "file_deleted", - "ignored_file", - "modified_file", - "new_file", - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file", - "staged_new_file", - "staged_new_file_deleted_file", - "staged_new_file_modified_file", - "subdir", - "subdir/current_file", - "subdir/deleted_file", - "subdir/modified_file", - "\xe8\xbf\x99", -}; - -static const unsigned int entry_statuses3[] = { - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_IGNORED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_WT_NEW | GIT_STATUS_INDEX_DELETED, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_NEW, -}; - -static const int entry_count3 = 22; - - -/* entries for a copy of tests/resources/status with some mods - * and different options to the status call - */ - -static const char *entry_paths4[] = { - ".new_file", - "current_file", - "current_file/current_file", - "current_file/modified_file", - "current_file/new_file", - "file_deleted", - "modified_file", - "new_file", - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file", - "staged_new_file", - "staged_new_file_deleted_file", - "staged_new_file_modified_file", - "subdir", - "subdir/current_file", - "subdir/deleted_file", - "subdir/modified_file", - "zzz_new_dir/new_file", - "zzz_new_file", - "\xe8\xbf\x99", -}; - -static const unsigned int entry_statuses4[] = { - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_WT_NEW | GIT_STATUS_INDEX_DELETED, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, -}; - -static const int entry_count4 = 23; - - -/* entries for a copy of tests/resources/status with options - * passed to the status call in order to only get the differences - * between the HEAD and the index (changes to be committed) - */ - -static const char *entry_paths5[] = { - "staged_changes", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_file_deleted", - "staged_delete_modified_file", - "staged_new_file", - "staged_new_file_deleted_file", - "staged_new_file_modified_file", -}; - -static const unsigned int entry_statuses5[] = { - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_INDEX_NEW, -}; - -static const int entry_count5 = 8; - - -/* entries for a copy of tests/resources/status with options - * passed to the status call in order to only get the differences - * between the workdir and the index (changes not staged, untracked files) - */ - -static const char *entry_paths6[] = { - "file_deleted", - "ignored_file", - "modified_file", - "new_file", - "staged_changes_file_deleted", - "staged_changes_modified_file", - "staged_delete_modified_file", - "staged_new_file_deleted_file", - "staged_new_file_modified_file", - "subdir/deleted_file", - "subdir/modified_file", - "subdir/new_file", - "\xe8\xbf\x99", -}; - -static const unsigned int entry_statuses6[] = { - GIT_STATUS_WT_DELETED, - GIT_STATUS_IGNORED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - GIT_STATUS_WT_NEW, -}; - -static const int entry_count6 = 13; diff --git a/tests-clar/status/status_helpers.c b/tests-clar/status/status_helpers.c deleted file mode 100644 index 902b65c4f..000000000 --- a/tests-clar/status/status_helpers.c +++ /dev/null @@ -1,101 +0,0 @@ -#include "clar_libgit2.h" -#include "status_helpers.h" - -int cb_status__normal( - const char *path, unsigned int status_flags, void *payload) -{ - status_entry_counts *counts = payload; - - if (counts->debug) - cb_status__print(path, status_flags, NULL); - - if (counts->entry_count >= counts->expected_entry_count) { - counts->wrong_status_flags_count++; - goto exit; - } - - if (strcmp(path, counts->expected_paths[counts->entry_count])) { - counts->wrong_sorted_path++; - goto exit; - } - - if (status_flags != counts->expected_statuses[counts->entry_count]) - counts->wrong_status_flags_count++; - -exit: - counts->entry_count++; - return 0; -} - -int cb_status__count(const char *p, unsigned int s, void *payload) -{ - volatile int *count = (int *)payload; - - GIT_UNUSED(p); - GIT_UNUSED(s); - - (*count)++; - - return 0; -} - -int cb_status__single(const char *p, unsigned int s, void *payload) -{ - status_entry_single *data = (status_entry_single *)payload; - - if (data->debug) - fprintf(stderr, "%02d: %s (%04x)\n", data->count, p, s); - - data->count++; - data->status = s; - - return 0; -} - -int cb_status__print( - const char *path, unsigned int status_flags, void *payload) -{ - char istatus = ' ', wstatus = ' '; - int icount = 0, wcount = 0; - - if (status_flags & GIT_STATUS_INDEX_NEW) { - istatus = 'A'; icount++; - } - if (status_flags & GIT_STATUS_INDEX_MODIFIED) { - istatus = 'M'; icount++; - } - if (status_flags & GIT_STATUS_INDEX_DELETED) { - istatus = 'D'; icount++; - } - if (status_flags & GIT_STATUS_INDEX_RENAMED) { - istatus = 'R'; icount++; - } - if (status_flags & GIT_STATUS_INDEX_TYPECHANGE) { - istatus = 'T'; icount++; - } - - if (status_flags & GIT_STATUS_WT_NEW) { - wstatus = 'A'; wcount++; - } - if (status_flags & GIT_STATUS_WT_MODIFIED) { - wstatus = 'M'; wcount++; - } - if (status_flags & GIT_STATUS_WT_DELETED) { - wstatus = 'D'; wcount++; - } - if (status_flags & GIT_STATUS_WT_TYPECHANGE) { - wstatus = 'T'; wcount++; - } - if (status_flags & GIT_STATUS_IGNORED) { - wstatus = 'I'; wcount++; - } - - fprintf(stderr, "%c%c %s (%d/%d%s)\n", - istatus, wstatus, path, icount, wcount, - (icount > 1 || wcount > 1) ? " INVALID COMBO" : ""); - - if (payload) - *((int *)payload) += 1; - - return 0; -} diff --git a/tests-clar/status/status_helpers.h b/tests-clar/status/status_helpers.h deleted file mode 100644 index f1f009e02..000000000 --- a/tests-clar/status/status_helpers.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef INCLUDE_cl_status_helpers_h__ -#define INCLUDE_cl_status_helpers_h__ - -typedef struct { - int wrong_status_flags_count; - int wrong_sorted_path; - int entry_count; - const unsigned int* expected_statuses; - const char** expected_paths; - int expected_entry_count; - bool debug; -} status_entry_counts; - -/* cb_status__normal takes payload of "status_entry_counts *" */ - -extern int cb_status__normal( - const char *path, unsigned int status_flags, void *payload); - - -/* cb_status__count takes payload of "int *" */ - -extern int cb_status__count(const char *p, unsigned int s, void *payload); - - -typedef struct { - int count; - unsigned int status; - bool debug; -} status_entry_single; - -/* cb_status__single takes payload of "status_entry_single *" */ - -extern int cb_status__single(const char *p, unsigned int s, void *payload); - -/* cb_status__print takes optional payload of "int *" */ - -extern int cb_status__print(const char *p, unsigned int s, void *payload); - -#endif diff --git a/tests-clar/status/submodules.c b/tests-clar/status/submodules.c deleted file mode 100644 index ef2888f7d..000000000 --- a/tests-clar/status/submodules.c +++ /dev/null @@ -1,223 +0,0 @@ -#include "clar_libgit2.h" -#include "buffer.h" -#include "path.h" -#include "posix.h" -#include "status_helpers.h" -#include "../submodule/submodule_helpers.h" - -static git_repository *g_repo = NULL; - -void test_status_submodules__initialize(void) -{ -} - -void test_status_submodules__cleanup(void) -{ -} - -void test_status_submodules__api(void) -{ - git_submodule *sm; - - g_repo = setup_fixture_submodules(); - - cl_assert(git_submodule_lookup(NULL, g_repo, "nonexistent") == GIT_ENOTFOUND); - - cl_assert(git_submodule_lookup(NULL, g_repo, "modified") == GIT_ENOTFOUND); - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo")); - cl_assert(sm != NULL); - cl_assert_equal_s("testrepo", git_submodule_name(sm)); - cl_assert_equal_s("testrepo", git_submodule_path(sm)); -} - -void test_status_submodules__0(void) -{ - int counts = 0; - - g_repo = setup_fixture_submodules(); - - cl_assert(git_path_isdir("submodules/.git")); - cl_assert(git_path_isdir("submodules/testrepo/.git")); - cl_assert(git_path_isfile("submodules/.gitmodules")); - - cl_git_pass( - git_status_foreach(g_repo, cb_status__count, &counts) - ); - - cl_assert_equal_i(6, counts); -} - -static const char *expected_files[] = { - ".gitmodules", - "added", - "deleted", - "ignored", - "modified", - "untracked" -}; - -static unsigned int expected_status[] = { - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_IGNORED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW -}; - -static int cb_status__match(const char *p, unsigned int s, void *payload) -{ - status_entry_counts *counts = payload; - int idx = counts->entry_count++; - - cl_assert_equal_s(counts->expected_paths[idx], p); - cl_assert(counts->expected_statuses[idx] == s); - - return 0; -} - -void test_status_submodules__1(void) -{ - status_entry_counts counts; - - g_repo = setup_fixture_submodules(); - - cl_assert(git_path_isdir("submodules/.git")); - cl_assert(git_path_isdir("submodules/testrepo/.git")); - cl_assert(git_path_isfile("submodules/.gitmodules")); - - memset(&counts, 0, sizeof(counts)); - counts.expected_paths = expected_files; - counts.expected_statuses = expected_status; - - cl_git_pass( - git_status_foreach(g_repo, cb_status__match, &counts) - ); - - cl_assert_equal_i(6, counts.entry_count); -} - -void test_status_submodules__single_file(void) -{ - unsigned int status = 0; - g_repo = setup_fixture_submodules(); - cl_git_pass( git_status_file(&status, g_repo, "testrepo") ); - cl_assert(!status); -} - -void test_status_submodules__moved_head(void) -{ - git_submodule *sm; - git_repository *smrepo; - git_oid oid; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts; - static const char *expected_files_with_sub[] = { - ".gitmodules", - "added", - "deleted", - "ignored", - "modified", - "testrepo", - "untracked" - }; - static unsigned int expected_status_with_sub[] = { - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_IGNORED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW - }; - - g_repo = setup_fixture_submodules(); - - cl_git_pass(git_submodule_lookup(&sm, g_repo, "testrepo")); - cl_git_pass(git_submodule_open(&smrepo, sm)); - - /* move submodule HEAD to c47800c7266a2be04c571c04d5a6614691ea99bd */ - cl_git_pass( - git_oid_fromstr(&oid, "c47800c7266a2be04c571c04d5a6614691ea99bd")); - cl_git_pass(git_repository_set_head_detached(smrepo, &oid)); - - /* first do a normal status, which should now include the submodule */ - - memset(&counts, 0, sizeof(counts)); - counts.expected_paths = expected_files_with_sub; - counts.expected_statuses = expected_status_with_sub; - - opts.flags = GIT_STATUS_OPT_DEFAULTS; - - cl_git_pass( - git_status_foreach_ext(g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(7, counts.entry_count); - - /* try again with EXCLUDE_SUBMODULES which should skip it */ - - memset(&counts, 0, sizeof(counts)); - counts.expected_paths = expected_files; - counts.expected_statuses = expected_status; - - opts.flags = GIT_STATUS_OPT_DEFAULTS | GIT_STATUS_OPT_EXCLUDE_SUBMODULES; - - cl_git_pass( - git_status_foreach_ext(g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(6, counts.entry_count); - - git_repository_free(smrepo); -} - -void test_status_submodules__dirty_workdir_only(void) -{ - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts; - static const char *expected_files_with_sub[] = { - ".gitmodules", - "added", - "deleted", - "ignored", - "modified", - "testrepo", - "untracked" - }; - static unsigned int expected_status_with_sub[] = { - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_INDEX_NEW, - GIT_STATUS_INDEX_DELETED, - GIT_STATUS_IGNORED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW - }; - - g_repo = setup_fixture_submodules(); - - cl_git_rewritefile("submodules/testrepo/README", "heyheyhey"); - cl_git_mkfile("submodules/testrepo/all_new.txt", "never seen before"); - - /* first do a normal status, which should now include the submodule */ - - memset(&counts, 0, sizeof(counts)); - counts.expected_paths = expected_files_with_sub; - counts.expected_statuses = expected_status_with_sub; - - opts.flags = GIT_STATUS_OPT_DEFAULTS; - - cl_git_pass( - git_status_foreach_ext(g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(7, counts.entry_count); - - /* try again with EXCLUDE_SUBMODULES which should skip it */ - - memset(&counts, 0, sizeof(counts)); - counts.expected_paths = expected_files; - counts.expected_statuses = expected_status; - - opts.flags = GIT_STATUS_OPT_DEFAULTS | GIT_STATUS_OPT_EXCLUDE_SUBMODULES; - - cl_git_pass( - git_status_foreach_ext(g_repo, &opts, cb_status__match, &counts)); - cl_assert_equal_i(6, counts.entry_count); -} diff --git a/tests-clar/status/worktree.c b/tests-clar/status/worktree.c deleted file mode 100644 index 34be6d34c..000000000 --- a/tests-clar/status/worktree.c +++ /dev/null @@ -1,875 +0,0 @@ -#include "clar_libgit2.h" -#include "fileops.h" -#include "ignore.h" -#include "status_data.h" -#include "posix.h" -#include "util.h" -#include "path.h" - -/** - * Cleanup - * - * This will be called once after each test finishes, even - * if the test failed - */ -void test_status_worktree__cleanup(void) -{ - cl_git_sandbox_cleanup(); -} - -/** - * Tests - Status determination on a working tree - */ -/* this test is equivalent to t18-status.c:statuscb0 */ -void test_status_worktree__whole_repository(void) -{ - status_entry_counts counts; - git_repository *repo = cl_git_sandbox_init("status"); - - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = entry_count0; - counts.expected_paths = entry_paths0; - counts.expected_statuses = entry_statuses0; - - cl_git_pass( - git_status_foreach(repo, 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 assert_show(const int entry_counts, const char *entry_paths[], - const unsigned int entry_statuses[], git_status_show_t show) -{ - status_entry_counts counts; - git_repository *repo = cl_git_sandbox_init("status"); - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = entry_counts; - counts.expected_paths = entry_paths; - counts.expected_statuses = entry_statuses; - - opts.flags = GIT_STATUS_OPT_DEFAULTS; - opts.show = show; - - 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_status_worktree__show_index_and_workdir(void) -{ - assert_show(entry_count0, entry_paths0, entry_statuses0, - GIT_STATUS_SHOW_INDEX_AND_WORKDIR); -} - -void test_status_worktree__show_index_only(void) -{ - assert_show(entry_count5, entry_paths5, entry_statuses5, - GIT_STATUS_SHOW_INDEX_ONLY); -} - -void test_status_worktree__show_workdir_only(void) -{ - assert_show(entry_count6, entry_paths6, entry_statuses6, - GIT_STATUS_SHOW_WORKDIR_ONLY); -} - -/* this test is equivalent to t18-status.c:statuscb1 */ -void test_status_worktree__empty_repository(void) -{ - int count = 0; - git_repository *repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_pass(git_status_foreach(repo, cb_status__count, &count)); - - cl_assert_equal_i(0, count); -} - -static int remove_file_cb(void *data, git_buf *file) -{ - const char *filename = git_buf_cstr(file); - - GIT_UNUSED(data); - - if (git__suffixcmp(filename, ".git") == 0) - return 0; - - if (git_path_isdir(filename)) - cl_git_pass(git_futils_rmdir_r(filename, NULL, GIT_RMDIR_REMOVE_FILES)); - else - cl_git_pass(p_unlink(git_buf_cstr(file))); - - return 0; -} - -/* this test is equivalent to t18-status.c:statuscb2 */ -void test_status_worktree__purged_worktree(void) -{ - status_entry_counts counts; - git_repository *repo = cl_git_sandbox_init("status"); - git_buf workdir = GIT_BUF_INIT; - - /* first purge the contents of the worktree */ - cl_git_pass(git_buf_sets(&workdir, git_repository_workdir(repo))); - cl_git_pass(git_path_direach(&workdir, 0, remove_file_cb, NULL)); - git_buf_free(&workdir); - - /* now get status */ - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = entry_count2; - counts.expected_paths = entry_paths2; - counts.expected_statuses = entry_statuses2; - - cl_git_pass( - git_status_foreach(repo, 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); -} - -/* this test is similar to t18-status.c:statuscb3 */ -void test_status_worktree__swap_subdir_and_file(void) -{ - status_entry_counts counts; - git_repository *repo = cl_git_sandbox_init("status"); - git_index *index; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - bool ignore_case; - - cl_git_pass(git_repository_index(&index, repo)); - ignore_case = (git_index_caps(index) & GIT_INDEXCAP_IGNORE_CASE) != 0; - git_index_free(index); - - /* first alter the contents of the worktree */ - cl_git_pass(p_rename("status/current_file", "status/swap")); - cl_git_pass(p_rename("status/subdir", "status/current_file")); - cl_git_pass(p_rename("status/swap", "status/subdir")); - - cl_git_mkfile("status/.HEADER", "dummy"); - cl_git_mkfile("status/42-is-not-prime.sigh", "dummy"); - cl_git_mkfile("status/README.md", "dummy"); - - /* now get status */ - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = entry_count3; - counts.expected_paths = ignore_case ? entry_paths3_icase : entry_paths3; - counts.expected_statuses = ignore_case ? entry_statuses3_icase : entry_statuses3; - - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_INCLUDE_IGNORED; - - 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_status_worktree__swap_subdir_with_recurse_and_pathspec(void) -{ - status_entry_counts counts; - git_repository *repo = cl_git_sandbox_init("status"); - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - - /* first alter the contents of the worktree */ - cl_git_pass(p_rename("status/current_file", "status/swap")); - cl_git_pass(p_rename("status/subdir", "status/current_file")); - cl_git_pass(p_rename("status/swap", "status/subdir")); - cl_git_mkfile("status/.new_file", "dummy"); - cl_git_pass(git_futils_mkdir_r("status/zzz_new_dir", NULL, 0777)); - cl_git_mkfile("status/zzz_new_dir/new_file", "dummy"); - cl_git_mkfile("status/zzz_new_file", "dummy"); - - /* now get status */ - memset(&counts, 0x0, sizeof(status_entry_counts)); - counts.expected_entry_count = entry_count4; - counts.expected_paths = entry_paths4; - counts.expected_statuses = entry_statuses4; - - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS; - /* TODO: set pathspec to "current_file" eventually */ - - 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); -} - -/* this test is equivalent to t18-status.c:singlestatus0 */ -void test_status_worktree__single_file(void) -{ - int i; - unsigned int status_flags; - git_repository *repo = cl_git_sandbox_init("status"); - - for (i = 0; i < (int)entry_count0; i++) { - cl_git_pass( - git_status_file(&status_flags, repo, entry_paths0[i]) - ); - cl_assert(entry_statuses0[i] == status_flags); - } -} - -/* this test is equivalent to t18-status.c:singlestatus1 */ -void test_status_worktree__single_nonexistent_file(void) -{ - int error; - unsigned int status_flags; - git_repository *repo = cl_git_sandbox_init("status"); - - error = git_status_file(&status_flags, repo, "nonexistent"); - cl_git_fail(error); - cl_assert(error == GIT_ENOTFOUND); -} - -/* this test is equivalent to t18-status.c:singlestatus2 */ -void test_status_worktree__single_nonexistent_file_empty_repo(void) -{ - int error; - unsigned int status_flags; - git_repository *repo = cl_git_sandbox_init("empty_standard_repo"); - - error = git_status_file(&status_flags, repo, "nonexistent"); - cl_git_fail(error); - cl_assert(error == GIT_ENOTFOUND); -} - -/* this test is equivalent to t18-status.c:singlestatus3 */ -void test_status_worktree__single_file_empty_repo(void) -{ - unsigned int status_flags; - git_repository *repo = cl_git_sandbox_init("empty_standard_repo"); - - cl_git_mkfile("empty_standard_repo/new_file", "new_file\n"); - - cl_git_pass(git_status_file(&status_flags, repo, "new_file")); - cl_assert(status_flags == GIT_STATUS_WT_NEW); -} - -/* this test is equivalent to t18-status.c:singlestatus4 */ -void test_status_worktree__single_folder(void) -{ - int error; - unsigned int status_flags; - git_repository *repo = cl_git_sandbox_init("status"); - - error = git_status_file(&status_flags, repo, "subdir"); - cl_git_fail(error); - cl_assert(error != GIT_ENOTFOUND); -} - - -void test_status_worktree__ignores(void) -{ - int i, ignored; - git_repository *repo = cl_git_sandbox_init("status"); - - for (i = 0; i < (int)entry_count0; i++) { - cl_git_pass( - git_status_should_ignore(&ignored, repo, entry_paths0[i]) - ); - cl_assert(ignored == (entry_statuses0[i] == GIT_STATUS_IGNORED)); - } - - cl_git_pass( - git_status_should_ignore(&ignored, repo, "nonexistent_file") - ); - cl_assert(!ignored); - - cl_git_pass( - git_status_should_ignore(&ignored, repo, "ignored_nonexistent_file") - ); - cl_assert(ignored); -} - -static int cb_status__check_592(const char *p, unsigned int s, void *payload) -{ - if (s != GIT_STATUS_WT_DELETED || - (payload != NULL && strcmp(p, (const char *)payload) != 0)) - return -1; - - return 0; -} - -void test_status_worktree__issue_592(void) -{ - git_repository *repo; - git_buf path = GIT_BUF_INIT; - - repo = cl_git_sandbox_init("issue_592"); - cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(repo), "l.txt")); - cl_git_pass(p_unlink(git_buf_cstr(&path))); - cl_assert(!git_path_exists("issue_592/l.txt")); - - cl_git_pass(git_status_foreach(repo, cb_status__check_592, "l.txt")); - - git_buf_free(&path); -} - -void test_status_worktree__issue_592_2(void) -{ - git_repository *repo; - git_buf path = GIT_BUF_INIT; - - repo = cl_git_sandbox_init("issue_592"); - cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(repo), "c/a.txt")); - cl_git_pass(p_unlink(git_buf_cstr(&path))); - cl_assert(!git_path_exists("issue_592/c/a.txt")); - - cl_git_pass(git_status_foreach(repo, cb_status__check_592, "c/a.txt")); - - git_buf_free(&path); -} - -void test_status_worktree__issue_592_3(void) -{ - git_repository *repo; - git_buf path = GIT_BUF_INIT; - - repo = cl_git_sandbox_init("issue_592"); - - cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(repo), "c")); - cl_git_pass(git_futils_rmdir_r(git_buf_cstr(&path), NULL, GIT_RMDIR_REMOVE_FILES)); - cl_assert(!git_path_exists("issue_592/c/a.txt")); - - cl_git_pass(git_status_foreach(repo, cb_status__check_592, "c/a.txt")); - - git_buf_free(&path); -} - -void test_status_worktree__issue_592_4(void) -{ - git_repository *repo; - git_buf path = GIT_BUF_INIT; - - repo = cl_git_sandbox_init("issue_592"); - - cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(repo), "t/b.txt")); - cl_git_pass(p_unlink(git_buf_cstr(&path))); - - cl_git_pass(git_status_foreach(repo, cb_status__check_592, "t/b.txt")); - - git_buf_free(&path); -} - -void test_status_worktree__issue_592_5(void) -{ - git_repository *repo; - git_buf path = GIT_BUF_INIT; - - repo = cl_git_sandbox_init("issue_592"); - - cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(repo), "t")); - cl_git_pass(git_futils_rmdir_r(git_buf_cstr(&path), NULL, GIT_RMDIR_REMOVE_FILES)); - cl_git_pass(p_mkdir(git_buf_cstr(&path), 0777)); - - cl_git_pass(git_status_foreach(repo, cb_status__check_592, NULL)); - - git_buf_free(&path); -} - -void test_status_worktree__issue_592_ignores_0(void) -{ - int count = 0; - status_entry_single st; - git_repository *repo = cl_git_sandbox_init("issue_592"); - - cl_git_pass(git_status_foreach(repo, cb_status__count, &count)); - cl_assert_equal_i(0, count); - - cl_git_rewritefile("issue_592/.gitignore", - ".gitignore\n*.txt\nc/\n[tT]*/\n"); - - cl_git_pass(git_status_foreach(repo, cb_status__count, &count)); - cl_assert_equal_i(1, count); - - /* This is a situation where the behavior of libgit2 is - * different from core git. Core git will show ignored.txt - * in the list of ignored files, even though the directory - * "t" is ignored and the file is untracked because we have - * the explicit "*.txt" ignore rule. Libgit2 just excludes - * all untracked files that are contained within ignored - * directories without explicitly listing them. - */ - cl_git_rewritefile("issue_592/t/ignored.txt", "ping"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &st)); - cl_assert_equal_i(1, st.count); - cl_assert(st.status == GIT_STATUS_IGNORED); - - cl_git_rewritefile("issue_592/c/ignored_by_dir", "ping"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &st)); - cl_assert_equal_i(1, st.count); - cl_assert(st.status == GIT_STATUS_IGNORED); - - cl_git_rewritefile("issue_592/t/ignored_by_dir_pattern", "ping"); - - memset(&st, 0, sizeof(st)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &st)); - cl_assert_equal_i(1, st.count); - cl_assert(st.status == GIT_STATUS_IGNORED); -} - -void test_status_worktree__issue_592_ignored_dirs_with_tracked_content(void) -{ - int count = 0; - git_repository *repo = cl_git_sandbox_init("issue_592b"); - - cl_git_pass(git_status_foreach(repo, cb_status__count, &count)); - cl_assert_equal_i(1, count); - - /* if we are really mimicking core git, then only ignored1.txt - * at the top level will show up in the ignores list here. - * everything else will be unmodified or skipped completely. - */ -} - -void test_status_worktree__conflict_with_diff3(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - git_index *index; - unsigned int status; - git_index_entry ancestor_entry, our_entry, their_entry; - - memset(&ancestor_entry, 0x0, sizeof(git_index_entry)); - memset(&our_entry, 0x0, sizeof(git_index_entry)); - memset(&their_entry, 0x0, sizeof(git_index_entry)); - - ancestor_entry.path = "modified_file"; - git_oid_fromstr(&ancestor_entry.oid, - "452e4244b5d083ddf0460acf1ecc74db9dcfa11a"); - - our_entry.path = "modified_file"; - git_oid_fromstr(&our_entry.oid, - "452e4244b5d083ddf0460acf1ecc74db9dcfa11a"); - - their_entry.path = "modified_file"; - git_oid_fromstr(&their_entry.oid, - "452e4244b5d083ddf0460acf1ecc74db9dcfa11a"); - - cl_git_pass(git_status_file(&status, repo, "modified_file")); - cl_assert_equal_i(GIT_STATUS_WT_MODIFIED, status); - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_remove(index, "modified_file", 0)); - cl_git_pass(git_index_conflict_add( - index, &ancestor_entry, &our_entry, &their_entry)); - cl_git_pass(git_index_write(index)); - git_index_free(index); - - cl_git_pass(git_status_file(&status, repo, "modified_file")); - - cl_assert_equal_i(GIT_STATUS_INDEX_DELETED | GIT_STATUS_WT_NEW, status); -} - -static const char *filemode_paths[] = { - "exec_off", - "exec_off2on_staged", - "exec_off2on_workdir", - "exec_off_untracked", - "exec_on", - "exec_on2off_staged", - "exec_on2off_workdir", - "exec_on_untracked", -}; - -static unsigned int filemode_statuses[] = { - GIT_STATUS_CURRENT, - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW, - GIT_STATUS_CURRENT, - GIT_STATUS_INDEX_MODIFIED, - GIT_STATUS_WT_MODIFIED, - GIT_STATUS_WT_NEW -}; - -static const int filemode_count = 8; - -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); -} - -static int cb_status__interrupt(const char *p, unsigned int s, void *payload) -{ - volatile int *count = (int *)payload; - - GIT_UNUSED(p); - GIT_UNUSED(s); - - (*count)++; - - return (*count == 8); -} - -void test_status_worktree__interruptable_foreach(void) -{ - int count = 0; - git_repository *repo = cl_git_sandbox_init("status"); - - cl_assert_equal_i( - GIT_EUSER, git_status_foreach(repo, cb_status__interrupt, &count) - ); - - cl_assert_equal_i(8, count); -} - -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_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_status_worktree__conflicted_item(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - git_index *index; - unsigned int status; - git_index_entry ancestor_entry, our_entry, their_entry; - - memset(&ancestor_entry, 0x0, sizeof(git_index_entry)); - memset(&our_entry, 0x0, sizeof(git_index_entry)); - memset(&their_entry, 0x0, sizeof(git_index_entry)); - - ancestor_entry.path = "modified_file"; - git_oid_fromstr(&ancestor_entry.oid, - "452e4244b5d083ddf0460acf1ecc74db9dcfa11a"); - - our_entry.path = "modified_file"; - git_oid_fromstr(&our_entry.oid, - "452e4244b5d083ddf0460acf1ecc74db9dcfa11a"); - - their_entry.path = "modified_file"; - git_oid_fromstr(&their_entry.oid, - "452e4244b5d083ddf0460acf1ecc74db9dcfa11a"); - - cl_git_pass(git_status_file(&status, repo, "modified_file")); - cl_assert_equal_i(GIT_STATUS_WT_MODIFIED, status); - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_conflict_add(index, &ancestor_entry, - &our_entry, &their_entry)); - - cl_git_pass(git_status_file(&status, repo, "modified_file")); - cl_assert_equal_i(GIT_STATUS_WT_MODIFIED, status); - - git_index_free(index); -} - -static void stage_and_commit(git_repository *repo, const char *path) -{ - git_index *index; - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_add_bypath(index, path)); - cl_repo_commit_from_index(NULL, repo, NULL, 1323847743, "Initial commit\n"); - git_index_free(index); -} - -static void assert_ignore_case( - bool should_ignore_case, - int expected_lower_cased_file_status, - int expected_camel_cased_file_status) -{ - unsigned int status; - git_buf lower_case_path = GIT_BUF_INIT, camel_case_path = GIT_BUF_INIT; - git_repository *repo, *repo2; - - repo = cl_git_sandbox_init("empty_standard_repo"); - cl_git_remove_placeholders(git_repository_path(repo), "dummy-marker.txt"); - - cl_repo_set_bool(repo, "core.ignorecase", should_ignore_case); - - cl_git_pass(git_buf_joinpath(&lower_case_path, - git_repository_workdir(repo), "plop")); - - cl_git_mkfile(git_buf_cstr(&lower_case_path), ""); - - stage_and_commit(repo, "plop"); - - cl_git_pass(git_repository_open(&repo2, "./empty_standard_repo")); - - cl_git_pass(git_status_file(&status, repo2, "plop")); - cl_assert_equal_i(GIT_STATUS_CURRENT, status); - - cl_git_pass(git_buf_joinpath(&camel_case_path, - git_repository_workdir(repo), "Plop")); - - cl_git_pass(p_rename(git_buf_cstr(&lower_case_path), git_buf_cstr(&camel_case_path))); - - cl_git_pass(git_status_file(&status, repo2, "plop")); - cl_assert_equal_i(expected_lower_cased_file_status, status); - - cl_git_pass(git_status_file(&status, repo2, "Plop")); - cl_assert_equal_i(expected_camel_cased_file_status, status); - - git_repository_free(repo2); - git_buf_free(&lower_case_path); - git_buf_free(&camel_case_path); -} - -void test_status_worktree__file_status_honors_core_ignorecase_true(void) -{ - assert_ignore_case(true, GIT_STATUS_CURRENT, GIT_STATUS_CURRENT); -} - -void test_status_worktree__file_status_honors_core_ignorecase_false(void) -{ - assert_ignore_case(false, GIT_STATUS_WT_DELETED, GIT_STATUS_WT_NEW); -} - -void test_status_worktree__file_status_honors_case_ignorecase_regarding_untracked_files(void) -{ - git_repository *repo = cl_git_sandbox_init("status"); - unsigned int status; - git_index *index; - - cl_repo_set_bool(repo, "core.ignorecase", false); - - repo = cl_git_sandbox_reopen(); - - /* Actually returns GIT_STATUS_IGNORED on Windows */ - cl_git_fail_with(git_status_file(&status, repo, "NEW_FILE"), GIT_ENOTFOUND); - - cl_git_pass(git_repository_index(&index, repo)); - - cl_git_pass(git_index_add_bypath(index, "new_file")); - cl_git_pass(git_index_write(index)); - git_index_free(index); - - /* Actually returns GIT_STATUS_IGNORED on Windows */ - cl_git_fail_with(git_status_file(&status, repo, "NEW_FILE"), GIT_ENOTFOUND); -} - -void test_status_worktree__simple_delete(void) -{ - git_repository *repo = cl_git_sandbox_init("renames"); - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - int count; - - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH | - GIT_STATUS_OPT_EXCLUDE_SUBMODULES | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS; - - count = 0; - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__count, &count) ); - cl_assert_equal_i(0, count); - - cl_must_pass(p_unlink("renames/untimely.txt")); - - count = 0; - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__count, &count) ); - cl_assert_equal_i(1, count); -} - -void test_status_worktree__simple_delete_indexed(void) -{ - git_repository *repo = cl_git_sandbox_init("renames"); - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - git_status_list *status; - - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH | - GIT_STATUS_OPT_EXCLUDE_SUBMODULES | - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS; - - cl_git_pass(git_status_list_new(&status, repo, &opts)); - cl_assert_equal_sz(0, git_status_list_entrycount(status)); - git_status_list_free(status); - - cl_must_pass(p_unlink("renames/untimely.txt")); - - cl_git_pass(git_status_list_new(&status, repo, &opts)); - cl_assert_equal_sz(1, git_status_list_entrycount(status)); - cl_assert_equal_i( - GIT_STATUS_WT_DELETED, git_status_byindex(status, 0)->status); - git_status_list_free(status); -} - -static const char *icase_paths[] = { "B", "c", "g", "H" }; -static unsigned int icase_statuses[] = { - GIT_STATUS_WT_MODIFIED, GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_MODIFIED, GIT_STATUS_WT_DELETED, -}; - -static const char *case_paths[] = { "B", "H", "c", "g" }; -static unsigned int case_statuses[] = { - GIT_STATUS_WT_MODIFIED, GIT_STATUS_WT_DELETED, - GIT_STATUS_WT_DELETED, GIT_STATUS_WT_MODIFIED, -}; - -void test_status_worktree__sorting_by_case(void) -{ - git_repository *repo = cl_git_sandbox_init("icase"); - git_index *index; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - bool native_ignore_case; - status_entry_counts counts; - - cl_git_pass(git_repository_index(&index, repo)); - native_ignore_case = - (git_index_caps(index) & GIT_INDEXCAP_IGNORE_CASE) != 0; - git_index_free(index); - - memset(&counts, 0, sizeof(counts)); - counts.expected_entry_count = 0; - counts.expected_paths = NULL; - counts.expected_statuses = NULL; - 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); - - cl_git_rewritefile("icase/B", "new stuff"); - cl_must_pass(p_unlink("icase/c")); - cl_git_rewritefile("icase/g", "new stuff"); - cl_must_pass(p_unlink("icase/H")); - - memset(&counts, 0, sizeof(counts)); - counts.expected_entry_count = 4; - if (native_ignore_case) { - counts.expected_paths = icase_paths; - counts.expected_statuses = icase_statuses; - } else { - counts.expected_paths = case_paths; - counts.expected_statuses = case_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); - - opts.flags = GIT_STATUS_OPT_SORT_CASE_SENSITIVELY; - - memset(&counts, 0, sizeof(counts)); - counts.expected_entry_count = 4; - counts.expected_paths = case_paths; - counts.expected_statuses = case_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); - - opts.flags = GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY; - - memset(&counts, 0, sizeof(counts)); - counts.expected_entry_count = 4; - counts.expected_paths = icase_paths; - counts.expected_statuses = icase_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_status_worktree__long_filenames(void) -{ - char path[260*4+1]; - const char *expected_paths[] = {path}; - const unsigned int expected_statuses[] = {GIT_STATUS_WT_NEW}; - - git_repository *repo = cl_git_sandbox_init("empty_standard_repo"); - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - status_entry_counts counts = {0}; - - // Create directory with amazingly long filename - sprintf(path, "empty_standard_repo/%s", longname); - cl_git_pass(git_futils_mkdir_r(path, NULL, 0777)); - sprintf(path, "empty_standard_repo/%s/foo", longname); - cl_git_mkfile(path, "dummy"); - - sprintf(path, "%s/foo", longname); - counts.expected_entry_count = 1; - counts.expected_paths = expected_paths; - counts.expected_statuses = expected_statuses; - - opts.show = GIT_STATUS_SHOW_WORKDIR_ONLY; - opts.flags = GIT_STATUS_OPT_DEFAULTS; - - 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); -} - diff --git a/tests-clar/status/worktree_init.c b/tests-clar/status/worktree_init.c deleted file mode 100644 index 296c27c86..000000000 --- a/tests-clar/status/worktree_init.c +++ /dev/null @@ -1,341 +0,0 @@ -#include "clar_libgit2.h" -#include "git2/sys/repository.h" - -#include "fileops.h" -#include "ignore.h" -#include "status_helpers.h" -#include "posix.h" -#include "util.h" -#include "path.h" - -static void cleanup_new_repo(void *path) -{ - cl_fixture_cleanup((char *)path); -} - -void test_status_worktree_init__cannot_retrieve_the_status_of_a_bare_repository(void) -{ - git_repository *repo; - unsigned int status = 0; - - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); - cl_assert_equal_i(GIT_EBAREREPO, git_status_file(&status, repo, "dummy")); - git_repository_free(repo); -} - -void test_status_worktree_init__first_commit_in_progress(void) -{ - git_repository *repo; - git_index *index; - status_entry_single result; - - cl_set_cleanup(&cleanup_new_repo, "getting_started"); - - cl_git_pass(git_repository_init(&repo, "getting_started", 0)); - cl_git_mkfile("getting_started/testfile.txt", "content\n"); - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(1, result.count); - cl_assert(result.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_add_bypath(index, "testfile.txt")); - cl_git_pass(git_index_write(index)); - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(1, result.count); - cl_assert(result.status == GIT_STATUS_INDEX_NEW); - - git_index_free(index); - git_repository_free(repo); -} - - - -void test_status_worktree_init__status_file_without_index_or_workdir(void) -{ - git_repository *repo; - unsigned int status = 0; - git_index *index; - - cl_git_pass(p_mkdir("wd", 0777)); - - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); - cl_git_pass(git_repository_set_workdir(repo, "wd", false)); - - cl_git_pass(git_index_open(&index, "empty-index")); - cl_assert_equal_i(0, (int)git_index_entrycount(index)); - git_repository_set_index(repo, index); - - cl_git_pass(git_status_file(&status, repo, "branch_file.txt")); - - cl_assert_equal_i(GIT_STATUS_INDEX_DELETED, status); - - git_repository_free(repo); - git_index_free(index); - cl_git_pass(p_rmdir("wd")); -} - -static void fill_index_wth_head_entries(git_repository *repo, git_index *index) -{ - git_oid oid; - git_commit *commit; - git_tree *tree; - - cl_git_pass(git_reference_name_to_id(&oid, repo, "HEAD")); - cl_git_pass(git_commit_lookup(&commit, repo, &oid)); - cl_git_pass(git_commit_tree(&tree, commit)); - - cl_git_pass(git_index_read_tree(index, tree)); - cl_git_pass(git_index_write(index)); - - git_tree_free(tree); - git_commit_free(commit); -} - -void test_status_worktree_init__status_file_with_clean_index_and_empty_workdir(void) -{ - git_repository *repo; - unsigned int status = 0; - git_index *index; - - cl_git_pass(p_mkdir("wd", 0777)); - - cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); - cl_git_pass(git_repository_set_workdir(repo, "wd", false)); - - cl_git_pass(git_index_open(&index, "my-index")); - fill_index_wth_head_entries(repo, index); - - git_repository_set_index(repo, index); - - cl_git_pass(git_status_file(&status, repo, "branch_file.txt")); - - cl_assert_equal_i(GIT_STATUS_WT_DELETED, status); - - git_repository_free(repo); - git_index_free(index); - cl_git_pass(p_rmdir("wd")); - cl_git_pass(p_unlink("my-index")); -} - -void test_status_worktree_init__bracket_in_filename(void) -{ - git_repository *repo; - git_index *index; - status_entry_single result; - unsigned int status_flags; - int error; - - #define FILE_WITH_BRACKET "LICENSE[1].md" - #define FILE_WITHOUT_BRACKET "LICENSE1.md" - - cl_set_cleanup(&cleanup_new_repo, "with_bracket"); - - cl_git_pass(git_repository_init(&repo, "with_bracket", 0)); - cl_git_mkfile("with_bracket/" FILE_WITH_BRACKET, "I have a bracket in my name\n"); - - /* file is new to working directory */ - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(1, result.count); - cl_assert(result.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET)); - cl_assert(status_flags == GIT_STATUS_WT_NEW); - - /* ignore the file */ - - cl_git_rewritefile("with_bracket/.gitignore", "*.md\n.gitignore\n"); - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(2, result.count); - cl_assert(result.status == GIT_STATUS_IGNORED); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET)); - cl_assert(status_flags == GIT_STATUS_IGNORED); - - /* don't ignore the file */ - - cl_git_rewritefile("with_bracket/.gitignore", ".gitignore\n"); - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(2, result.count); - cl_assert(result.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET)); - cl_assert(status_flags == GIT_STATUS_WT_NEW); - - /* add the file to the index */ - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_add_bypath(index, FILE_WITH_BRACKET)); - cl_git_pass(git_index_write(index)); - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(2, result.count); - cl_assert(result.status == GIT_STATUS_INDEX_NEW); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET)); - cl_assert(status_flags == GIT_STATUS_INDEX_NEW); - - /* Create file without bracket */ - - cl_git_mkfile("with_bracket/" FILE_WITHOUT_BRACKET, "I have no bracket in my name!\n"); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITHOUT_BRACKET)); - cl_assert(status_flags == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_file(&status_flags, repo, "LICENSE\\[1\\].md")); - cl_assert(status_flags == GIT_STATUS_INDEX_NEW); - - error = git_status_file(&status_flags, repo, FILE_WITH_BRACKET); - cl_git_fail(error); - cl_assert_equal_i(GIT_EAMBIGUOUS, error); - - git_index_free(index); - git_repository_free(repo); -} - -void test_status_worktree_init__space_in_filename(void) -{ - git_repository *repo; - git_index *index; - status_entry_single result; - unsigned int status_flags; - -#define FILE_WITH_SPACE "LICENSE - copy.md" - - cl_set_cleanup(&cleanup_new_repo, "with_space"); - cl_git_pass(git_repository_init(&repo, "with_space", 0)); - cl_git_mkfile("with_space/" FILE_WITH_SPACE, "I have a space in my name\n"); - - /* file is new to working directory */ - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(1, result.count); - cl_assert(result.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE)); - cl_assert(status_flags == GIT_STATUS_WT_NEW); - - /* ignore the file */ - - cl_git_rewritefile("with_space/.gitignore", "*.md\n.gitignore\n"); - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(2, result.count); - cl_assert(result.status == GIT_STATUS_IGNORED); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE)); - cl_assert(status_flags == GIT_STATUS_IGNORED); - - /* don't ignore the file */ - - cl_git_rewritefile("with_space/.gitignore", ".gitignore\n"); - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(2, result.count); - cl_assert(result.status == GIT_STATUS_WT_NEW); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE)); - cl_assert(status_flags == GIT_STATUS_WT_NEW); - - /* add the file to the index */ - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_add_bypath(index, FILE_WITH_SPACE)); - cl_git_pass(git_index_write(index)); - - memset(&result, 0, sizeof(result)); - cl_git_pass(git_status_foreach(repo, cb_status__single, &result)); - cl_assert_equal_i(2, result.count); - cl_assert(result.status == GIT_STATUS_INDEX_NEW); - - cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE)); - cl_assert(status_flags == GIT_STATUS_INDEX_NEW); - - git_index_free(index); - git_repository_free(repo); -} - -static int cb_status__expected_path(const char *p, unsigned int s, void *payload) -{ - const char *expected_path = (const char *)payload; - - GIT_UNUSED(s); - - if (payload == NULL) - cl_fail("Unexpected path"); - - cl_assert_equal_s(expected_path, p); - - return 0; -} - -void test_status_worktree_init__disable_pathspec_match(void) -{ - git_repository *repo; - git_status_options opts = GIT_STATUS_OPTIONS_INIT; - char *file_with_bracket = "LICENSE[1].md", - *imaginary_file_with_bracket = "LICENSE[1-2].md"; - - cl_set_cleanup(&cleanup_new_repo, "pathspec"); - cl_git_pass(git_repository_init(&repo, "pathspec", 0)); - cl_git_mkfile("pathspec/LICENSE[1].md", "screaming bracket\n"); - cl_git_mkfile("pathspec/LICENSE1.md", "no bracket\n"); - - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | - GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH; - opts.pathspec.count = 1; - opts.pathspec.strings = &file_with_bracket; - - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__expected_path, - file_with_bracket) - ); - - /* Test passing a pathspec matching files in the workdir. */ - /* Must not match because pathspecs are disabled. */ - opts.pathspec.strings = &imaginary_file_with_bracket; - cl_git_pass( - git_status_foreach_ext(repo, &opts, cb_status__expected_path, NULL) - ); - - git_repository_free(repo); -} - -void test_status_worktree_init__new_staged_file_must_handle_crlf(void) -{ - git_repository *repo; - git_index *index; - unsigned int status; - - cl_set_cleanup(&cleanup_new_repo, "getting_started"); - cl_git_pass(git_repository_init(&repo, "getting_started", 0)); - - /* Ensure that repo has core.autocrlf=true */ - cl_repo_set_bool(repo, "core.autocrlf", true); - - cl_git_mkfile("getting_started/testfile.txt", "content\r\n"); /* Content with CRLF */ - - cl_git_pass(git_repository_index(&index, repo)); - cl_git_pass(git_index_add_bypath(index, "testfile.txt")); - cl_git_pass(git_index_write(index)); - - cl_git_pass(git_status_file(&status, repo, "testfile.txt")); - cl_assert_equal_i(GIT_STATUS_INDEX_NEW, status); - - git_index_free(index); - git_repository_free(repo); -} - |
