Commit b8cd7aa9f6990b80730c1d7ab85a0443c054ca0b

Vicent Martí 2013-07-09T17:20:55

Merge pull request #1704 from arrbee/kill-status-index-then-workdir Remove GIT_STATUS_SHOW_INDEX_THEN_WORKDIR option

diff --git a/include/git2/status.h b/include/git2/status.h
index 63aea2f..fd0e831 100644
--- a/include/git2/status.h
+++ b/include/git2/status.h
@@ -60,25 +60,24 @@ typedef int (*git_status_cb)(
 	const char *path, unsigned int status_flags, void *payload);
 
 /**
- * For extended status, select the files on which to report status.
+ * Select the files on which to report status.
+ *
+ * With `git_status_foreach_ext`, this will control which changes get
+ * callbacks.  With `git_status_list_new`, these will control which
+ * changes are included in the list.
  *
  * - GIT_STATUS_SHOW_INDEX_AND_WORKDIR is the default.  This roughly
- *   matches `git status --porcelain` where each file gets a callback
- *   indicating its status in the index and in the working directory.
+ *   matches `git status --porcelain` regarding which files are
+ *   included and in what order.
  * - GIT_STATUS_SHOW_INDEX_ONLY only gives status based on HEAD to index
  *   comparison, not looking at working directory changes.
  * - GIT_STATUS_SHOW_WORKDIR_ONLY only gives status based on index to
  *   working directory comparison, not comparing the index to the HEAD.
- * - GIT_STATUS_SHOW_INDEX_THEN_WORKDIR runs index-only then workdir-only,
- *   issuing (up to) two callbacks per file (first index, then workdir).
- *   This is slightly more efficient than separate calls and can make it
- *   easier to emulate plain `git status` text output.
  */
 typedef enum {
 	GIT_STATUS_SHOW_INDEX_AND_WORKDIR = 0,
 	GIT_STATUS_SHOW_INDEX_ONLY = 1,
 	GIT_STATUS_SHOW_WORKDIR_ONLY = 2,
-	GIT_STATUS_SHOW_INDEX_THEN_WORKDIR = 3,
 } git_status_show_t;
 
 /**
diff --git a/src/diff.c b/src/diff.c
index 9e9528e..0980f41 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -1249,6 +1249,8 @@ int git_diff__paired_foreach(
 
 	i_max = head2idx ? head2idx->deltas.length : 0;
 	j_max = idx2wd ? idx2wd->deltas.length : 0;
+	if (!i_max && !j_max)
+		return 0;
 
 	/* At some point, tree-to-index diffs will probably never ignore case,
 	 * even if that isn't true now.  Index-to-workdir diffs may or may not
diff --git a/src/status.c b/src/status.c
index 7da94ed..ccb8d37 100644
--- a/src/status.c
+++ b/src/status.c
@@ -257,9 +257,8 @@ int git_status_list_new(
 		opts ? opts->show : GIT_STATUS_SHOW_INDEX_AND_WORKDIR;
 	int error = 0;
 	unsigned int flags = opts ? opts->flags : GIT_STATUS_OPT_DEFAULTS;
-	git_diff_list *head2idx = NULL;
 
-	assert(show <= GIT_STATUS_SHOW_INDEX_THEN_WORKDIR);
+	assert(show <= GIT_STATUS_SHOW_WORKDIR_ONLY);
 
 	*out = NULL;
 
@@ -308,10 +307,8 @@ int git_status_list_new(
 				&status->head2idx, repo, head, NULL, &diffopt)) < 0)
 			goto done;
 
-		head2idx = status->head2idx;
-
 		if ((flags & GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX) != 0 &&
-			(error = git_diff_find_similar(head2idx, NULL)) < 0)
+			(error = git_diff_find_similar(status->head2idx, NULL)) < 0)
 			goto done;
 	}
 
@@ -325,16 +322,8 @@ int git_status_list_new(
 			goto done;
 	}
 
-	if (show == GIT_STATUS_SHOW_INDEX_THEN_WORKDIR) {
-		if ((error = git_diff__paired_foreach(
-				head2idx, NULL, status_collect, status)) < 0)
-			goto done;
-
-		head2idx = NULL;
-	}
-
 	if ((error = git_diff__paired_foreach(
-			head2idx, status->idx2wd, status_collect, status)) < 0)
+			status->head2idx, status->idx2wd, status_collect, status)) < 0)
 		goto done;
 
 	if (flags & GIT_STATUS_OPT_SORT_CASE_SENSITIVELY)
diff --git a/tests-clar/status/status_data.h b/tests-clar/status/status_data.h
index 2758784..3efa934 100644
--- a/tests-clar/status/status_data.h
+++ b/tests-clar/status/status_data.h
@@ -320,60 +320,3 @@ static const unsigned int entry_statuses6[] = {
 };
 
 static const int entry_count6 = 13;
-
-
-/* entries for a copy of tests/resources/status with options
- * passed to the status call in order to get the differences
- * between the HEAD and the index and then between the workdir
- * and the index.
- */
-
-static const char *entry_paths7[] = {
-	"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",
-	"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_statuses7[] = {
-	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,
-	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_count7 = 21;
diff --git a/tests-clar/status/worktree.c b/tests-clar/status/worktree.c
index ac99376..0e315cd 100644
--- a/tests-clar/status/worktree.c
+++ b/tests-clar/status/worktree.c
@@ -82,12 +82,6 @@ void test_status_worktree__show_workdir_only(void)
 		GIT_STATUS_SHOW_WORKDIR_ONLY);
 }
 
-void test_status_worktree__show_index_then_workdir_only(void)
-{
-	assert_show(entry_count7, entry_paths7, entry_statuses7,
-		GIT_STATUS_SHOW_INDEX_THEN_WORKDIR);
-}
-
 /* this test is equivalent to t18-status.c:statuscb1 */
 void test_status_worktree__empty_repository(void)
 {