Commit 79d5b5c91683720c9055d1f5ea3f9468ca9356a4

Alan Rogers 2014-06-03T17:42:52

Add GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED and a (failing) test for it.

diff --git a/include/git2/status.h b/include/git2/status.h
index 858f688..76ffab6 100644
--- a/include/git2/status.h
+++ b/include/git2/status.h
@@ -134,28 +134,28 @@ typedef enum {
  * together as `GIT_STATUS_OPT_DEFAULTS` if you want them as a baseline.
  */
 typedef enum {
-	GIT_STATUS_OPT_INCLUDE_UNTRACKED        = (1u << 0),
-	GIT_STATUS_OPT_INCLUDE_IGNORED          = (1u << 1),
-	GIT_STATUS_OPT_INCLUDE_UNMODIFIED       = (1u << 2),
-	GIT_STATUS_OPT_EXCLUDE_SUBMODULES       = (1u << 3),
-	GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS   = (1u << 4),
-	GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH   = (1u << 5),
-	GIT_STATUS_OPT_RECURSE_IGNORED_DIRS     = (1u << 6),
-	GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX    = (1u << 7),
-	GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR = (1u << 8),
-	GIT_STATUS_OPT_SORT_CASE_SENSITIVELY    = (1u << 9),
-	GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY  = (1u << 10),
-	GIT_STATUS_OPT_RENAMES_FROM_REWRITES    = (1u << 11),
-	GIT_STATUS_OPT_NO_REFRESH               = (1u << 12),
-	GIT_STATUS_OPT_UPDATE_INDEX             = (1u << 13),
-	GIT_STATUS_OPT_INCLUDE_UNREADABLE       = (1u << 14),
+	GIT_STATUS_OPT_INCLUDE_UNTRACKED                = (1u << 0),
+	GIT_STATUS_OPT_INCLUDE_IGNORED                  = (1u << 1),
+	GIT_STATUS_OPT_INCLUDE_UNMODIFIED               = (1u << 2),
+	GIT_STATUS_OPT_EXCLUDE_SUBMODULES               = (1u << 3),
+	GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS           = (1u << 4),
+	GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH           = (1u << 5),
+	GIT_STATUS_OPT_RECURSE_IGNORED_DIRS             = (1u << 6),
+	GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX            = (1u << 7),
+	GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR         = (1u << 8),
+	GIT_STATUS_OPT_SORT_CASE_SENSITIVELY            = (1u << 9),
+	GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY          = (1u << 10),
+	GIT_STATUS_OPT_RENAMES_FROM_REWRITES            = (1u << 11),
+	GIT_STATUS_OPT_NO_REFRESH                       = (1u << 12),
+	GIT_STATUS_OPT_UPDATE_INDEX                     = (1u << 13),
+	GIT_STATUS_OPT_INCLUDE_UNREADABLE               = (1u << 14),
+	GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED  = (1u << 15),
 } git_status_opt_t;
 
 #define GIT_STATUS_OPT_DEFAULTS \
 	(GIT_STATUS_OPT_INCLUDE_IGNORED | \
 	GIT_STATUS_OPT_INCLUDE_UNTRACKED | \
 	GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS)
-
 /**
  * Options to control how `git_status_foreach_ext()` will issue callbacks.
  *
diff --git a/tests/status/worktree.c b/tests/status/worktree.c
index 5e1399b..e3af0e5 100644
--- a/tests/status/worktree.c
+++ b/tests/status/worktree.c
@@ -936,7 +936,7 @@ void test_status_worktree__update_stat_cache_0(void)
 	git_status_list_free(status);
 }
 
-void test_status_worktree__nopermissions(void)
+void test_status_worktree__unreadable(void)
 {
 	const char *expected_paths[] = { "no_permission/foo" };
 	const unsigned int expected_statuses[] = {GIT_STATUS_WT_UNREADABLE};
@@ -967,3 +967,38 @@ void test_status_worktree__nopermissions(void)
 	cl_assert_equal_i(0, counts.wrong_status_flags_count);
 	cl_assert_equal_i(0, counts.wrong_sorted_path);
 }
+
+void test_status_worktree__unreadable_as_untracked(void)
+{
+	const char *expected_paths[] = { "no_permission/foo" };
+	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 no read permission */
+	cl_git_pass(git_futils_mkdir_r("empty_standard_repo/no_permission", NULL, 0777));
+	cl_git_mkfile("empty_standard_repo/no_permission/foo", "dummy");
+	p_chmod("empty_standard_repo/no_permission", 0644);
+
+	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 |
+		GIT_STATUS_OPT_INCLUDE_UNREADABLE |
+		GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED;
+
+	cl_git_pass(
+		git_status_foreach_ext(repo, &opts, cb_status__normal, &counts) );
+
+	/* Restore permissions so we can cleanup :) */
+	p_chmod("empty_standard_repo/no_permission", 0777);
+
+	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);
+}
+