Junio C Hamano wrote: > Shouldn't this done as part of 4/7 where is_submodule_modified() > starts reading from the porcelain v2 output? 4/7 does adjust for > the change from double question mark (porcelain v1) to a single one > for untracked, but at the same time it needs to prepare for these > 'u' (unmerged), '1' (normal modification) and '2' (mods with rename) > to appear in the output, no? > > IOW, with 4/7 and 7/7 done as separate steps, isn't the system > broken between these steps? No. Both before and after patch 4, this code has to determine two details from a submodule: 1. Does it have untracked files? 2. Does it have any modifications to tracked files (including submodules)? Using porcelain v1 format, (1) is represented by a "??" line and (2) is represented by any other line. Using porcelain v2 format, (1) is represented by a "u" line and (2) is represented by any other line. So patch 4 does not intend to change behavior. This patch 7 is trying to do something more subtle. Suppose I have a superproject 'parent', with a submodule 'parent/sub', which itself contains a submodule 'parent/sub/subsub'. Now suppose I run, from within 'parent': echo hi >sub/subsub/stray-file Both before and after patch 4, if I run "git status" from 'parent' then I will learn that "sub" was modified. "git status" within 'sub' would tell me that "subsub" has an untracked file. But from the end user's point of view, even when running in "parent", what I want to know is that there is an untracked file. Treating it as a modification instead of untracked file is confusing and does not answer the user's actual question. That is what patch 7 tries to fix. In other words, patch 7 is about changing that list of two questions from before. Something like 1. Does it or any submodule contained within it have untracked files, that I could add with "git add -N --recurse-submodules"? 2. Does it or any submodule contained within it have modified files, that I could add with "git add -u --recurse-submodules"? 3. Does it or any submodule contained within it have a changed HEAD, that I could also add with "git add -u --recurse-submodules"? Question (3) didn't come up before because when there are no nested submodules, the diff machinery answers it (saving us from getting the answer from the status --porcelain we recurse to). Thanks and hope that helps, Jonathan