Skip to content

Commit c6d8ccf

Browse files
bmwillgitster
authored andcommitted
wt-status: actually ignore submodules when requested
Since ff6f1f5 (submodule-config: lazy-load a repository's .gitmodules file, 2017-08-03) rebase interactive fails if there are any submodules with unstaged changes which have been configured with a value for 'submodule.<name>.ignore' in the repository's config. This is due to how configured values of 'submodule.<name>.ignore' are handled in addition to a change in how the submodule config is loaded. When the diff machinery hits a submodule (gitlink as well as a corresponding entry in the submodule subsystem) it will read the value of 'submodule.<name>.ignore' stored in the repository's config and if the config is present it will clear the 'IGNORE_SUBMODULES' (which is the flag explicitly requested by rebase interactive), 'IGNORE_UNTRACKED_IN_SUBMODULES', and 'IGNORE_DIRTY_SUBMODULES' diff flags and then set one of them based on the configured value. Historically this wasn't a problem because the submodule subsystem wasn't initialized because the .gitmodules file wasn't explicitly loaded by the rebase interactive command. So when the diff machinery hit a submodule it would skip over reading any configured values of 'submodule.<name>.ignore'. In order to preserve the behavior of submodules being ignored by rebase interactive, also set the 'OVERRIDE_SUBMODULE_CONFIG' diff flag when submodules are requested to be ignored when checking for unstaged changes. Reported-by: Orgad Shaneh <[email protected]> Signed-off-by: Brandon Williams <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 557a599 commit c6d8ccf

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

t/t3426-rebase-submodule.sh

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,21 @@ git_rebase_interactive () {
4040

4141
test_submodule_switch "git_rebase_interactive"
4242

43+
test_expect_success 'rebase interactive ignores modified submodules' '
44+
test_when_finished "rm -rf super sub" &&
45+
git init sub &&
46+
git -C sub commit --allow-empty -m "Initial commit" &&
47+
git init super &&
48+
git -C super submodule add ../sub &&
49+
git -C super config submodule.sub.ignore dirty &&
50+
>super/foo &&
51+
git -C super add foo &&
52+
git -C super commit -m "Initial commit" &&
53+
test_commit -C super a &&
54+
test_commit -C super b &&
55+
test_commit -C super/sub c &&
56+
set_fake_editor &&
57+
git -C super rebase -i HEAD^^
58+
'
59+
4360
test_done

wt-status.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2262,8 +2262,10 @@ int has_unstaged_changes(int ignore_submodules)
22622262
int result;
22632263

22642264
init_revisions(&rev_info, NULL);
2265-
if (ignore_submodules)
2265+
if (ignore_submodules) {
22662266
DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
2267+
DIFF_OPT_SET(&rev_info.diffopt, OVERRIDE_SUBMODULE_CONFIG);
2268+
}
22672269
DIFF_OPT_SET(&rev_info.diffopt, QUICK);
22682270
diff_setup_done(&rev_info.diffopt);
22692271
result = run_diff_files(&rev_info, 0);

0 commit comments

Comments
 (0)