Fix broken status EXCLUDE_SUBMODULES logic The exclude submodules flag was not doing the right thing, in that a file with no diff between the head and the index and just a delete in the workdir could be excluded if submodules were excluded.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
diff --git a/src/status.c b/src/status.c
index 20e45b7..ba4eef8 100644
--- a/src/status.c
+++ b/src/status.c
@@ -81,23 +81,33 @@ static unsigned int workdir_delta2status(git_delta_t workdir_status)
}
static bool status_is_included(
- git_status_list *statuslist,
+ git_status_list *status,
git_diff_delta *head2idx,
git_diff_delta *idx2wd)
{
+ if (!(status->opts.flags & GIT_STATUS_OPT_EXCLUDE_SUBMODULES))
+ return 1;
+
/* if excluding submodules and this is a submodule everywhere */
- if ((statuslist->opts.flags & GIT_STATUS_OPT_EXCLUDE_SUBMODULES) != 0) {
- bool in_tree = (head2idx && head2idx->status != GIT_DELTA_ADDED);
- bool in_index = (head2idx && head2idx->status != GIT_DELTA_DELETED);
- bool in_wd = (idx2wd && idx2wd->status != GIT_DELTA_DELETED);
-
- if ((!in_tree || head2idx->old_file.mode == GIT_FILEMODE_COMMIT) &&
- (!in_index || head2idx->new_file.mode == GIT_FILEMODE_COMMIT) &&
- (!in_wd || idx2wd->new_file.mode == GIT_FILEMODE_COMMIT))
- return 0;
+ if (head2idx) {
+ if (head2idx->status != GIT_DELTA_ADDED &&
+ head2idx->old_file.mode != GIT_FILEMODE_COMMIT)
+ return 1;
+ if (head2idx->status != GIT_DELTA_DELETED &&
+ head2idx->new_file.mode != GIT_FILEMODE_COMMIT)
+ return 1;
+ }
+ if (idx2wd) {
+ if (idx2wd->status != GIT_DELTA_ADDED &&
+ idx2wd->old_file.mode != GIT_FILEMODE_COMMIT)
+ return 1;
+ if (idx2wd->status != GIT_DELTA_DELETED &&
+ idx2wd->new_file.mode != GIT_FILEMODE_COMMIT)
+ return 1;
}
- return 1;
+ /* only get here if every valid mode is GIT_FILEMODE_COMMIT */
+ return 0;
}
static git_status_t status_compute(