submodule.c: correctly handle nested submodules in is_submodule_modified
[gitweb.git] / submodule.c
index fa21c7bb72436c295430f815b528006d4bd95128..3da65100e39b85ff9aaa2f40f60c9b35820c6512 100644 (file)
@@ -1078,8 +1078,25 @@ unsigned is_submodule_modified(const char *path, int ignore_untracked)
                /* regular untracked files */
                if (buf.buf[0] == '?')
                        dirty_submodule |= DIRTY_SUBMODULE_UNTRACKED;
-               else
-                       dirty_submodule |= DIRTY_SUBMODULE_MODIFIED;
+
+               if (buf.buf[0] == 'u' ||
+                   buf.buf[0] == '1' ||
+                   buf.buf[0] == '2') {
+                       /* T = line type, XY = status, SSSS = submodule state */
+                       if (buf.len < strlen("T XY SSSS"))
+                               die("BUG: invalid status --porcelain=2 line %s",
+                                   buf.buf);
+
+                       if (buf.buf[5] == 'S' && buf.buf[8] == 'U')
+                               /* nested untracked file */
+                               dirty_submodule |= DIRTY_SUBMODULE_UNTRACKED;
+
+                       if (buf.buf[0] == 'u' ||
+                           buf.buf[0] == '2' ||
+                           memcmp(buf.buf + 5, "S..U", 4))
+                               /* other change */
+                               dirty_submodule |= DIRTY_SUBMODULE_MODIFIED;
+               }
 
                if ((dirty_submodule & DIRTY_SUBMODULE_MODIFIED) &&
                    ((dirty_submodule & DIRTY_SUBMODULE_UNTRACKED) ||