unsigned ce_option, unsigned *dirty_submodule)
{
int changed = ce_match_stat(ce, st, ce_option);
- if (S_ISGITLINK(ce->ce_mode)
- && !DIFF_OPT_TST(diffopt, IGNORE_SUBMODULES)
- && (!changed || DIFF_OPT_TST(diffopt, DIRTY_SUBMODULES))) {
- *dirty_submodule = is_submodule_modified(ce->name, DIFF_OPT_TST(diffopt, IGNORE_UNTRACKED_IN_SUBMODULES));
+ if (S_ISGITLINK(ce->ce_mode)) {
+ unsigned orig_flags = diffopt->flags;
+ if (!DIFF_OPT_TST(diffopt, OVERRIDE_SUBMODULE_CONFIG))
+ set_diffopt_flags_from_submodule_config(diffopt, ce->name);
+ if (DIFF_OPT_TST(diffopt, IGNORE_SUBMODULES))
+ changed = 0;
+ else if (!DIFF_OPT_TST(diffopt, IGNORE_DIRTY_SUBMODULES)
+ && (!changed || DIFF_OPT_TST(diffopt, DIRTY_SUBMODULES)))
+ *dirty_submodule = is_submodule_modified(ce->name, DIFF_OPT_TST(diffopt, IGNORE_UNTRACKED_IN_SUBMODULES));
+ diffopt->flags = orig_flags;
}
return changed;
}
int index_differs_from(const char *def, int diff_flags)
{
struct rev_info rev;
+ struct setup_revision_opt opt;
init_revisions(&rev, NULL);
- setup_revisions(0, NULL, &rev, def);
+ memset(&opt, 0, sizeof(opt));
+ opt.def = def;
+ setup_revisions(0, NULL, &rev, &opt);
DIFF_OPT_SET(&rev.diffopt, QUICK);
DIFF_OPT_SET(&rev.diffopt, EXIT_WITH_STATUS);
rev.diffopt.flags |= diff_flags;