Commit a409acefbbadeb607e4d6dde681bff5aed6ae9fc

Russell Belfer 2014-04-24T11:59:50

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.

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;