diff --git a/include/git2/status.h b/include/git2/status.h index 63aea2f3b..fd0e83104 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 9e9528ef9..0980f412a 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 7da94edc1..ccb8d37da 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 27587843b..3efa934ea 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 ac993767a..0e315cd60 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) {