Support comma-separated list of options in --diff-merges=. This allows for shorter: --diff-merges=on,hide instead of: --diff-merges=on --diff-merges=hide Signed-off-by: Sergey Organov <sorganov@xxxxxxxxx> --- Documentation/diff-options.txt | 5 +++-- diff-merges.c | 22 ++++++++++++++++++---- t/t4013-diff-various.sh | 8 ++++++++ 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt index fe15693492a2..977f9135b0d6 100644 --- a/Documentation/diff-options.txt +++ b/Documentation/diff-options.txt @@ -38,7 +38,8 @@ ifdef::git-log[] --no-diff-merges:: Specify diff format to be used for merge commits. Default is {diff-merges-default} unless `--first-parent` is in use, in which case - `first-parent` is the default. + `first-parent` is the default. Comma-separated list of + supported values is accepted as well. + --diff-merges=(off|none)::: --no-diff-merges::: @@ -53,7 +54,7 @@ ifdef::git-log[] `log.diffMerges` configuration parameter, which default value is `separate`. + - `-m` is a shortcut for '--diff-merges=on --diff-merges=hide'. + `-m` is a shortcut for '--diff-merges=on,hide'. In addition it implies `-p` when `log.diffMerges-m-imply-p` is active. + diff --git a/diff-merges.c b/diff-merges.c index 1fbf476d378e..bb2797ff8cc5 100644 --- a/diff-merges.c +++ b/diff-merges.c @@ -1,6 +1,7 @@ #include "diff-merges.h" #include "revision.h" +#include "strbuf.h" typedef void (*diff_merges_setup_func_t)(struct rev_info *); static void set_separate(struct rev_info *revs); @@ -109,12 +110,25 @@ static diff_merges_setup_func_t func_by_opt(const char *optarg) static void set_diff_merges(struct rev_info *revs, const char *optarg) { - diff_merges_setup_func_t func = func_by_opt(optarg); + char const delim = ','; + struct strbuf **opts = strbuf_split_str(optarg, delim, -1); + struct strbuf **p; - if (!func) - die(_("invalid value for '%s': '%s'"), "--diff-merges", optarg); + for (p = opts; *p; p++) { + diff_merges_setup_func_t func; + char *opt = (*p)->buf; + int len = (*p)->len; - func(revs); + if (opt[len - 1] == delim) + opt[len - 1] = '\0'; + func = func_by_opt(opt); + if (!func) { + strbuf_list_free(opts); + die(_("invalid value for '%s': '%s'"), "--diff-merges", opt); + } + func(revs); + } + strbuf_list_free(opts); } /* diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh index 1789dd6063c5..a07513e67fd6 100755 --- a/t/t4013-diff-various.sh +++ b/t/t4013-diff-various.sh @@ -485,6 +485,14 @@ test_expect_success 'log --diff-merges=on matches --diff-merges=separate' ' test_cmp expected actual ' +test_expect_success 'log --diff-merges=<V1>,<V2>' ' + git log --diff-merges=1,hide master >result && + process_diffs result >expected && + git log --diff-merges=1 --diff-merges=hide master >result && + process_diffs result >actual && + test_cmp expected actual +' + test_expect_success 'deny wrong log.diffMerges config' ' test_config log.diffMerges wrong-value && test_expect_code 128 git log -- 2.25.1