Historically, in "diff-index -m", "-m" does not mean "do not ignore merges", but "match missing". Despite this, diff-index abuses 'ignore_merges' field being set by "-m", that in turn causes more troubles. Add separate 'diff_index_match_missing' field for diff-index to use and set it when we encounter "-m" option. This field won't then be cleared when primary meaning of "-m" is reverted (e.g., by "--no-diff-merges"), nor it will be affected by future option(s) that might drive 'ignore_merges' field. Use this new field from diff-lib:do_oneway_diff() instead of abusing 'ignore_merges' field. Signed-off-by: Sergey Organov <sorganov@xxxxxxxxx> --- diff-lib.c | 10 ++-------- revision.c | 6 ++++++ revision.h | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/diff-lib.c b/diff-lib.c index 25fd2dee19c4..8c40111b5f35 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -404,14 +404,8 @@ static void do_oneway_diff(struct unpack_trees_options *o, /* if the entry is not checked out, don't examine work tree */ cached = o->index_only || (idx && ((idx->ce_flags & CE_VALID) || ce_skip_worktree(idx))); - /* - * Backward compatibility wart - "diff-index -m" does - * not mean "do not ignore merges", but "match_missing". - * - * But with the revision flag parsing, that's found in - * "!revs->ignore_merges". - */ - match_missing = !revs->ignore_merges; + + match_missing = revs->diff_index_match_missing; if (cached && idx && ce_stage(idx)) { struct diff_filepair *pair; diff --git a/revision.c b/revision.c index 6aa7f4f56755..95f9cfddb02c 100644 --- a/revision.c +++ b/revision.c @@ -2325,6 +2325,12 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg revs->diffopt.flags.tree_in_recursive = 1; } else if (!strcmp(arg, "-m")) { revs->ignore_merges = 0; + /* + * Backward compatibility wart - "diff-index -m" does + * not mean "do not ignore merges", but "match_missing", + * so set separate flag for it. + */ + revs->diff_index_match_missing = 1; } else if (!strcmp(arg, "-c")) { revs->diff = 1; revs->dense_combined_merges = 0; diff --git a/revision.h b/revision.h index f412ae85ebaf..979dddbdaf7c 100644 --- a/revision.h +++ b/revision.h @@ -188,6 +188,7 @@ struct rev_info { unsigned int diff:1, full_diff:1, show_root_diff:1, + diff_index_match_missing:1, no_commit_id:1, verbose_header:1, ignore_merges:1, -- 2.25.1