Am 01.09.21 um 18:52 schrieb Sergey Organov: > Johannes Sixt <j6t@xxxxxxxx> writes: > >> Since 19b2517f95a0 (diff-merges: move specific diff-index "-m" handling >> to diff-index, 2021-05-21) git diff-index no longer accepts --cc. This >> breaks gitk: it invokes >> >> git diff-index --cached -p -C --cc --no-commit-id -U3 HEAD >> >> to show the staged changes (when the line "Local changes checked in to >> index but not committed" is selected). >> >> The man page of git diff-index does not mention --cc as an option. I >> haven't fully grokked the meaning of --cc, so I cannot tell whether this >> absence has any significance (is deliberate or an omission). >> >> Is gitk wrong to add --cc unconditionally? Should it do so only when >> there are conflicts? Or not at all? >> > > Here is a patch that fixes diff-index to accept --cc again: > > Subject: [PATCH] diff-index: restore -c/--cc options handling > > This fixes git:19b2517f95a0a908a8ada7417cf0717299e7e1aa > "diff-merges: move specific diff-index "-m" handling to diff-index" > > That commit disabled handling of all diff for merges options in > diff-index on an assumption that they are unused. However, it later > appeared that -c and --cc, even though undocumented and not being > covered by tests, happen to have had particular effect on diff-index > output. > > Restore original -c/--cc options handling by diff-index. Thank you! I can confirm that gitk works again as expected with this patch. -- Hannes > > Signed-off-by: Sergey Organov <sorganov@xxxxxxxxx> > --- > builtin/diff-index.c | 6 +++--- > diff-merges.c | 14 ++++---------- > diff-merges.h | 2 +- > 3 files changed, 8 insertions(+), 14 deletions(-) > > diff --git a/builtin/diff-index.c b/builtin/diff-index.c > index cf09559e422d..5fd23ab5b6c5 100644 > --- a/builtin/diff-index.c > +++ b/builtin/diff-index.c > @@ -29,10 +29,10 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix) > prefix = precompose_argv_prefix(argc, argv, prefix); > > /* > - * We need no diff for merges options, and we need to avoid conflict > - * with our own meaning of "-m". > + * We need (some of) diff for merges options (e.g., --cc), and we need > + * to avoid conflict with our own meaning of "-m". > */ > - diff_merges_suppress_options_parsing(); > + diff_merges_suppress_m_parsing(); > > argc = setup_revisions(argc, argv, &rev, NULL); > for (i = 1; i < argc; i++) { > diff --git a/diff-merges.c b/diff-merges.c > index d897fd8a2933..5060ccd890bd 100644 > --- a/diff-merges.c > +++ b/diff-merges.c > @@ -6,7 +6,7 @@ typedef void (*diff_merges_setup_func_t)(struct rev_info *); > static void set_separate(struct rev_info *revs); > > static diff_merges_setup_func_t set_to_default = set_separate; > -static int suppress_parsing; > +static int suppress_m_parsing; > > static void suppress(struct rev_info *revs) > { > @@ -91,9 +91,9 @@ int diff_merges_config(const char *value) > return 0; > } > > -void diff_merges_suppress_options_parsing(void) > +void diff_merges_suppress_m_parsing(void) > { > - suppress_parsing = 1; > + suppress_m_parsing = 1; > } > > int diff_merges_parse_opts(struct rev_info *revs, const char **argv) > @@ -102,10 +102,7 @@ int diff_merges_parse_opts(struct rev_info *revs, const char **argv) > const char *optarg; > const char *arg = argv[0]; > > - if (suppress_parsing) > - return 0; > - > - if (!strcmp(arg, "-m")) { > + if (!suppress_m_parsing && !strcmp(arg, "-m")) { > set_to_default(revs); > } else if (!strcmp(arg, "-c")) { > set_combined(revs); > @@ -153,9 +150,6 @@ void diff_merges_set_dense_combined_if_unset(struct rev_info *revs) > > void diff_merges_setup_revs(struct rev_info *revs) > { > - if (suppress_parsing) > - return; > - > if (revs->combine_merges == 0) > revs->dense_combined_merges = 0; > if (revs->separate_merges == 0) > diff --git a/diff-merges.h b/diff-merges.h > index b5d57f6563e3..19639689bb05 100644 > --- a/diff-merges.h > +++ b/diff-merges.h > @@ -11,7 +11,7 @@ struct rev_info; > > int diff_merges_config(const char *value); > > -void diff_merges_suppress_options_parsing(void); > +void diff_merges_suppress_m_parsing(void); > > int diff_merges_parse_opts(struct rev_info *revs, const char **argv); > >