Handle explicitly ignored dir slightly differently When considering status of untracked directories, if we find an explicitly ignored item, even if it is a directory, treat the parent as an IGNORED item. It was accidentally being treated as an EMPTY item because we were not looking into the ignored subdir.
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
diff --git a/src/iterator.c b/src/iterator.c
index dfa7997..ef27fa7 100644
--- a/src/iterator.c
+++ b/src/iterator.c
@@ -1566,25 +1566,26 @@ int git_iterator_advance_over_with_status(
&wi->ignores, wi->fi.entry.path, &wi->is_ignored) < 0)
wi->is_ignored = true;
- if (!wi->is_ignored && S_ISDIR(entry->mode)) {
+ /* if we found an explicitly ignored item, then update from
+ * EMPTY to IGNORED
+ */
+ if (wi->is_ignored)
+ *status = GIT_ITERATOR_STATUS_IGNORED;
+ else if (S_ISDIR(entry->mode)) {
error = git_iterator_advance_into(&entry, iter);
if (!error)
continue;
else if (error == GIT_ENOTFOUND) {
error = 0;
- wi->is_ignored = true; /* treat empty directories as ignored */
+ wi->is_ignored = true; /* mark empty directories as ignored */
} else
break; /* real error, stop here */
- }
-
- /* if we found a non-ignored item, treat parent as untracked */
- if (!wi->is_ignored) {
+ } else {
+ /* we found a non-ignored item, treat parent as untracked */
*status = GIT_ITERATOR_STATUS_NORMAL;
break;
}
- if (entry && !S_ISDIR(entry->mode))
- *status = GIT_ITERATOR_STATUS_IGNORED;
if ((error = git_iterator_advance(&entry, iter)) < 0)
break;