]> git.proxmox.com Git - libgit2.git/commitdiff
New tests of status for repo inside repo
authorRussell Belfer <rb@github.com>
Wed, 2 Apr 2014 04:32:06 +0000 (21:32 -0700)
committerRussell Belfer <rb@github.com>
Wed, 2 Apr 2014 04:32:06 +0000 (21:32 -0700)
tests/status/status_helpers.h
tests/status/submodules.c

index f1f009e02efe7f5ab50fb120e7360da8b1010989..242076cc9391d6676fbd6e18688159d2fa2d6032 100644 (file)
@@ -8,9 +8,19 @@ typedef struct {
        const unsigned int* expected_statuses;
        const char** expected_paths;
        int expected_entry_count;
+       const char *file;
+       int line;
        bool debug;
 } status_entry_counts;
 
+#define status_counts_init(counts, paths, statuses) do { \
+       memset(&(counts), 0, sizeof(counts)); \
+       (counts).expected_statuses = (statuses); \
+       (counts).expected_paths = (paths); \
+       (counts).file = __FILE__; \
+       (counts).line = __LINE__; \
+       } while (0)
+
 /* cb_status__normal takes payload of "status_entry_counts *" */
 
 extern int cb_status__normal(
index 8575f9f2d53364a6a5e929b8eb69ee9648a4f644..6d0d63a5f6f52178475d7bc7b531a3a9b5fa8844 100644 (file)
@@ -72,8 +72,15 @@ 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);
+       clar__assert_equal(
+               counts->file, counts->line,
+               "Status path mismatch", 1,
+               "%s", counts->expected_paths[idx], p);
+
+       clar__assert_equal(
+               counts->file, counts->line,
+               "Status code mismatch", 1,
+               "%o", counts->expected_statuses[idx], s);
 
        return 0;
 }
@@ -88,13 +95,9 @@ void test_status_submodules__1(void)
        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;
+       status_counts_init(counts, expected_files, expected_status);
 
-       cl_git_pass(
-               git_status_foreach(g_repo, cb_status__match, &counts)
-       );
+       cl_git_pass( git_status_foreach(g_repo, cb_status__match, &counts) );
 
        cl_assert_equal_i(6, counts.entry_count);
 }
@@ -146,24 +149,19 @@ void test_status_submodules__moved_head(void)
 
        /* 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;
 
+       status_counts_init(
+               counts, expected_files_with_sub, expected_status_with_sub);
        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;
 
+       status_counts_init(counts, expected_files, expected_status);
        cl_git_pass(
                git_status_foreach_ext(g_repo, &opts, cb_status__match, &counts));
        cl_assert_equal_i(6, counts.entry_count);
@@ -201,24 +199,19 @@ void test_status_submodules__dirty_workdir_only(void)
 
        /* 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;
 
+       status_counts_init(
+               counts, expected_files_with_sub, expected_status_with_sub);
        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;
 
+       status_counts_init(counts, expected_files, expected_status);
        cl_git_pass(
                git_status_foreach_ext(g_repo, &opts, cb_status__match, &counts));
        cl_assert_equal_i(6, counts.entry_count);
@@ -240,3 +233,159 @@ void test_status_submodules__uninitialized(void)
        git_repository_free(cloned_repo);
        cl_git_sandbox_cleanup();
 }
+
+void test_status_submodules__contained_untracked_repo(void)
+{
+       git_status_options opts = GIT_STATUS_OPTIONS_INIT;
+       status_entry_counts counts;
+       git_repository *contained;
+       static const char *expected_files_not_ignored[] = {
+               ".gitmodules",
+               "added",
+               "deleted",
+               "modified",
+               "untracked"
+       };
+       static unsigned int expected_status_not_ignored[] = {
+               GIT_STATUS_WT_MODIFIED,
+               GIT_STATUS_INDEX_NEW,
+               GIT_STATUS_INDEX_DELETED,
+               GIT_STATUS_WT_MODIFIED,
+               GIT_STATUS_WT_NEW,
+       };
+       static const char *expected_files_with_untracked[] = {
+               ".gitmodules",
+               "added",
+               "deleted",
+               "dir/file.md",
+               "modified",
+               "untracked"
+       };
+       static const char *expected_files_with_untracked_dir[] = {
+               ".gitmodules",
+               "added",
+               "deleted",
+               "dir/",
+               "modified",
+               "untracked"
+       };
+       static unsigned int expected_status_with_untracked[] = {
+               GIT_STATUS_WT_MODIFIED,
+               GIT_STATUS_INDEX_NEW,
+               GIT_STATUS_INDEX_DELETED,
+               GIT_STATUS_WT_NEW,
+               GIT_STATUS_WT_MODIFIED,
+               GIT_STATUS_WT_NEW
+       };
+
+       g_repo = setup_fixture_submodules();
+
+       /* skip empty directory */
+
+       cl_must_pass(p_mkdir("submodules/dir", 0777));
+       opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED;
+
+       status_counts_init(
+               counts, expected_files_not_ignored, expected_status_not_ignored);
+       cl_git_pass(git_status_foreach_ext(
+               g_repo, &opts, cb_status__match, &counts));
+       cl_assert_equal_i(5, counts.entry_count);
+
+       /* still skipping because empty == ignored */
+
+       opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED |
+               GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS;
+
+       status_counts_init(
+               counts, expected_files_not_ignored, expected_status_not_ignored);
+       cl_git_pass(git_status_foreach_ext(
+               g_repo, &opts, cb_status__match, &counts));
+       cl_assert_equal_i(5, counts.entry_count);
+
+       /* find non-ignored contents of directory */
+
+       cl_git_mkfile("submodules/dir/file.md", "hello");
+       opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED |
+               GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS;
+
+       status_counts_init(
+               counts, expected_files_with_untracked, expected_status_with_untracked);
+       cl_git_pass(git_status_foreach_ext(
+               g_repo, &opts, cb_status__match, &counts));
+       cl_assert_equal_i(6, counts.entry_count);
+
+       /* but skip if all content is ignored */
+
+       cl_git_append2file("submodules/.git/info/exclude", "\n*.md\n\n");
+       opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED |
+               GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS;
+
+       status_counts_init(
+               counts, expected_files_not_ignored, expected_status_not_ignored);
+       cl_git_pass(git_status_foreach_ext(
+               g_repo, &opts, cb_status__match, &counts));
+       cl_assert_equal_i(5, counts.entry_count);
+
+       /* same is true if it contains a git link */
+
+       cl_git_mkfile("submodules/dir/.git", "gitlink: ../.git");
+       opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED |
+               GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS;
+
+       status_counts_init(
+               counts, expected_files_not_ignored, expected_status_not_ignored);
+       cl_git_pass(git_status_foreach_ext(
+               g_repo, &opts, cb_status__match, &counts));
+       cl_assert_equal_i(5, counts.entry_count);
+
+       /* but if it contains tracked files, it should just show up as a
+        * directory and exclude the files in it
+        */
+
+       cl_git_mkfile("submodules/dir/another_file", "hello");
+       opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED |
+               GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS;
+
+       status_counts_init(
+               counts, expected_files_with_untracked_dir,
+               expected_status_with_untracked);
+       cl_git_pass(git_status_foreach_ext(
+               g_repo, &opts, cb_status__match, &counts));
+       cl_assert_equal_i(6, counts.entry_count);
+
+       /* that applies to a git repo with a .git directory too */
+
+       cl_must_pass(p_unlink("submodules/dir/.git"));
+       cl_git_pass(git_repository_init(&contained, "submodules/dir", false));
+       git_repository_free(contained);
+       opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED |
+               GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS;
+
+       status_counts_init(
+               counts, expected_files_with_untracked_dir,
+               expected_status_with_untracked);
+       cl_git_pass(git_status_foreach_ext(
+               g_repo, &opts, cb_status__match, &counts));
+       cl_assert_equal_i(6, counts.entry_count);
+
+       /* same result even if we don't recurse into subdirectories */
+
+       opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED;
+
+       status_counts_init(
+               counts, expected_files_with_untracked_dir,
+               expected_status_with_untracked);
+       cl_git_pass(git_status_foreach_ext(
+               g_repo, &opts, cb_status__match, &counts));
+       cl_assert_equal_i(6, counts.entry_count);
+
+       /* and if we remove the untracked file, it goes back to ignored */
+
+       cl_must_pass(p_unlink("submodules/dir/another_file"));
+
+       status_counts_init(
+               counts, expected_files_not_ignored, expected_status_not_ignored);
+       cl_git_pass(git_status_foreach_ext(
+               g_repo, &opts, cb_status__match, &counts));
+       cl_assert_equal_i(5, counts.entry_count);
+}