зеркало из https://github.com/microsoft/git.git
submodule.c: correctly handle nested submodules in is_submodule_modified
Suppose I have a superproject 'super', with two submodules 'super/sub' and 'super/sub1'. 'super/sub' itself contains a submodule 'super/sub/subsub'. Now suppose I run, from within 'super': echo hi >sub/subsub/stray-file echo hi >sub1/stray-file Currently we get would see the following output in git-status: git status --short m sub ? sub1 With this patch applied, the untracked file in the nested submodule is displayed as an untracked file on the 'super' level as well. git status --short ? sub ? sub1 This doesn't change the output of 'git status --porcelain=1' for nested submodules, because its output is always ' M' for either untracked files or local modifications no matter the nesting level of the submodule. 'git status --porcelain=2' is affected by this change in a nested submodule, though. Without this patch it would report the direct submodule as modified and having no untracked files. With this patch it would report untracked files. Chalk this up as a bug fix. This bug fix also affects the default output (non-short, non-porcelain) of git-status, which is not tested here. Signed-off-by: Stefan Beller <sbeller@google.com> Reviewed-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
dd6962dd73
Коммит
40069d6e3a
|
@ -189,6 +189,8 @@ Submodules have more state and instead report
|
|||
since modified content or untracked files in a submodule cannot be added
|
||||
via `git add` in the superproject to prepare a commit.
|
||||
|
||||
'm' and '?' are applied recursively. For example if a nested submodule
|
||||
in a submodule contains an untracked file, this is reported as '?' as well.
|
||||
|
||||
If -b is used the short-format status is preceded by a line
|
||||
|
||||
|
|
21
submodule.c
21
submodule.c
|
@ -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) ||
|
||||
|
|
|
@ -659,7 +659,7 @@ test_expect_success 'rm of a populated nested submodule with nested untracked fi
|
|||
test -d submod &&
|
||||
test -f submod/.git &&
|
||||
git status -s -uno --ignore-submodules=none >actual &&
|
||||
test_cmp expect.modified_inside actual &&
|
||||
test_cmp expect.modified_untracked actual &&
|
||||
git rm -f submod &&
|
||||
test ! -d submod &&
|
||||
git status -s -uno --ignore-submodules=none >actual &&
|
||||
|
|
|
@ -356,7 +356,7 @@ test_expect_success 'status with untracked file in nested submodule (porcelain=2
|
|||
git -C super status --porcelain=2 >output &&
|
||||
sanitize_output output &&
|
||||
diff output - <<-\EOF
|
||||
1 .M S.M. 160000 160000 160000 HASH HASH sub1
|
||||
1 .M S..U 160000 160000 160000 HASH HASH sub1
|
||||
1 .M S..U 160000 160000 160000 HASH HASH sub2
|
||||
1 .M S..U 160000 160000 160000 HASH HASH sub3
|
||||
EOF
|
||||
|
@ -365,7 +365,7 @@ test_expect_success 'status with untracked file in nested submodule (porcelain=2
|
|||
test_expect_success 'status with untracked file in nested submodule (short)' '
|
||||
git -C super status --short >output &&
|
||||
diff output - <<-\EOF
|
||||
m sub1
|
||||
? sub1
|
||||
? sub2
|
||||
? sub3
|
||||
EOF
|
||||
|
|
Загрузка…
Ссылка в новой задаче