Merge branch 'js/defeat-ignore-submodules-config-with-explicit-addition'

Even when diff.ignoreSubmodules tells us to ignore submodule
changes, "git commit" with an index that already records changes to
submodules should include the submodule changes in the resulting
commit, but it did not.

* js/defeat-ignore-submodules-config-with-explicit-addition:
  diff-lib: honor override_submodule_config flag bit
This commit is contained in:
Junio C Hamano 2023-06-23 11:21:17 -07:00
commit 4ee088deb8
2 changed files with 31 additions and 1 deletions

View file

@ -669,8 +669,15 @@ int index_differs_from(struct repository *r,
setup_revisions(0, NULL, &rev, &opt);
rev.diffopt.flags.quick = 1;
rev.diffopt.flags.exit_with_status = 1;
if (flags)
if (flags) {
diff_flags_or(&rev.diffopt.flags, flags);
/*
* Now that flags are merged, honor override_submodule_config
* and ignore_submodules from passed flags.
*/
if (flags->override_submodule_config)
rev.diffopt.flags.ignore_submodules = flags->ignore_submodules;
}
rev.diffopt.ita_invisible_in_index = ita_invisible_in_index;
run_diff_index(&rev, 1);
has_changes = rev.diffopt.flags.has_changes;

View file

@ -1179,4 +1179,27 @@ test_expect_success 'submodule update --recursive skip submodules with strategy=
test_cmp expect.err actual.err
'
add_submodule_commit_and_validate () {
HASH=$(git rev-parse HEAD) &&
git update-index --add --cacheinfo 160000,$HASH,sub &&
git commit -m "create submodule" &&
echo "160000 commit $HASH sub" >expect &&
git ls-tree HEAD -- sub >actual &&
test_cmp expect actual
}
test_expect_success 'commit with staged submodule change' '
add_submodule_commit_and_validate
'
test_expect_success 'commit with staged submodule change with ignoreSubmodules dirty' '
test_config diff.ignoreSubmodules dirty &&
add_submodule_commit_and_validate
'
test_expect_success 'commit with staged submodule change with ignoreSubmodules all' '
test_config diff.ignoreSubmodules all &&
add_submodule_commit_and_validate
'
test_done