diff options
author | Brandon Williams <bmwill@google.com> | 2017-11-06 14:08:19 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-11-07 11:20:55 +0900 |
commit | c6d8ccf3a25556e1cac99433721e3c05ba970d89 (patch) | |
tree | 7d80aafc1fc9729e63c1bad8d91ab4eae79effec | |
parent | 557a5998df19faf8641acfc5b6b1c3c2ba64dca9 (diff) | |
download | git-c6d8ccf3a25556e1cac99433721e3c05ba970d89.tar.gz git-c6d8ccf3a25556e1cac99433721e3c05ba970d89.tar.xz |
wt-status: actually ignore submodules when requested
Since ff6f1f564 (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 <orgads@gmail.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rwxr-xr-x | t/t3426-rebase-submodule.sh | 17 | ||||
-rw-r--r-- | wt-status.c | 4 |
2 files changed, 20 insertions, 1 deletions
diff --git a/t/t3426-rebase-submodule.sh b/t/t3426-rebase-submodule.sh index ebf4f5e4b..a2bba04ba 100755 --- a/t/t3426-rebase-submodule.sh +++ b/t/t3426-rebase-submodule.sh @@ -40,4 +40,21 @@ git_rebase_interactive () { test_submodule_switch "git_rebase_interactive" +test_expect_success 'rebase interactive ignores modified submodules' ' + test_when_finished "rm -rf super sub" && + git init sub && + git -C sub commit --allow-empty -m "Initial commit" && + git init super && + git -C super submodule add ../sub && + git -C super config submodule.sub.ignore dirty && + >super/foo && + git -C super add foo && + git -C super commit -m "Initial commit" && + test_commit -C super a && + test_commit -C super b && + test_commit -C super/sub c && + set_fake_editor && + git -C super rebase -i HEAD^^ +' + test_done diff --git a/wt-status.c b/wt-status.c index 77c27c511..7346a89ef 100644 --- a/wt-status.c +++ b/wt-status.c @@ -2262,8 +2262,10 @@ int has_unstaged_changes(int ignore_submodules) int result; init_revisions(&rev_info, NULL); - if (ignore_submodules) + if (ignore_submodules) { DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES); + DIFF_OPT_SET(&rev_info.diffopt, OVERRIDE_SUBMODULE_CONFIG); + } DIFF_OPT_SET(&rev_info.diffopt, QUICK); diff_setup_done(&rev_info.diffopt); result = run_diff_files(&rev_info, 0); |