]> git.ipfire.org Git - thirdparty/git.git/commitdiff
merge/pull: add the "--compact-summary" option
authorJunio C Hamano <gitster@pobox.com>
Thu, 12 Jun 2025 22:25:36 +0000 (15:25 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 13 Jun 2025 18:50:37 +0000 (11:50 -0700)
"git merge" and "git pull" shows "git diff --stat --summary @{1}"
when they finish to indicate the extent of the changes brought into
the history by default.  While it gives a good overview, it becomes
annoying when there are very many created or deleted paths.

Introduce "--compact-summary" option to these two commands that
tells it to instead show "git diff --compact-summary @{1}", which
gives the same information in a lot more compact form in such a
situation.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-merge.adoc
Documentation/merge-options.adoc
builtin/merge.c
builtin/pull.c
t/t7600-merge.sh

index 12aa859d16def950bfdfc8919d0e33e1bec4d0e3..d53923c3b73cfcfe59fe939161b7dd1d5f4f8137 100644 (file)
@@ -9,7 +9,7 @@ git-merge - Join two or more development histories together
 SYNOPSIS
 --------
 [synopsis]
-git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit]
+git merge [-n] [--stat] [--compact-summary] [--no-commit] [--squash] [--[no-]edit]
        [--no-verify] [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
        [--[no-]allow-unrelated-histories]
        [--[no-]rerere-autoupdate] [-m <msg>] [-F <file>]
index 078f4f6157a1af16596c4b6babbdfeae22640bb8..95ef491be109e09a40a4ed2e68944607efbf5ba9 100644 (file)
@@ -113,6 +113,9 @@ include::signoff-option.adoc[]
 With `-n` or `--no-stat` do not show a diffstat at the end of the
 merge.
 
+`--compact-summary`::
+       Show a compact-summary at the end of the merge.
+
 `--squash`::
 `--no-squash`::
        Produce the working tree and index state as if a real merge
index ce90e52fe451d673dbcd3d6e67b8c08d2c1f6758..3a6ece14af6a53f5f41c16f31c24ed3d37e4a255 100644 (file)
@@ -69,7 +69,10 @@ static const char * const builtin_merge_usage[] = {
        NULL
 };
 
-static int show_diffstat = 1, shortlog_len = -1, squash;
+#define MERGE_SHOW_DIFFSTAT 1
+#define MERGE_SHOW_COMPACTSUMMARY 2
+
+static int show_diffstat = MERGE_SHOW_DIFFSTAT, shortlog_len = -1, squash;
 static int option_commit = -1;
 static int option_edit = -1;
 static int allow_trivial = 1, have_message, verify_signatures;
@@ -243,12 +246,28 @@ static int option_parse_strategy(const struct option *opt UNUSED,
        return 0;
 }
 
+static int option_parse_compact_summary(const struct option *opt,
+                                       const char *name UNUSED, int unset)
+{
+       int *setting = opt->value;
+
+       if (unset)
+               *setting = 0;
+       else
+               *setting = MERGE_SHOW_COMPACTSUMMARY;
+       return 0;
+}
+
 static struct option builtin_merge_options[] = {
        OPT_SET_INT('n', NULL, &show_diffstat,
                N_("do not show a diffstat at the end of the merge"), 0),
        OPT_BOOL(0, "stat", &show_diffstat,
                N_("show a diffstat at the end of the merge")),
        OPT_BOOL(0, "summary", &show_diffstat, N_("(synonym to --stat)")),
+       OPT_CALLBACK_F(0, "compact-summary", &show_diffstat, N_("compact-summary"),
+                      N_("show a compact-summary at the end of the merge"),
+                      PARSE_OPT_NOARG,
+                      option_parse_compact_summary),
        {
                .type = OPTION_INTEGER,
                .long_name = "log",
@@ -494,8 +513,19 @@ static void finish(struct commit *head_commit,
                struct diff_options opts;
                repo_diff_setup(the_repository, &opts);
                init_diffstat_widths(&opts);
-               opts.output_format |=
-                       DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT;
+
+               switch (show_diffstat) {
+               case MERGE_SHOW_DIFFSTAT: /* 1 */
+                       opts.output_format |=
+                               DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT;
+                       break;
+               case MERGE_SHOW_COMPACTSUMMARY: /* 2 */
+                       opts.output_format |= DIFF_FORMAT_DIFFSTAT;
+                       opts.flags.stat_with_summary = 1;
+                       break;
+               default:
+                       break;
+               }
                opts.detect_rename = DIFF_DETECT_RENAME;
                diff_setup_done(&opts);
                diff_tree_oid(head, new_head, "", &opts);
@@ -643,7 +673,8 @@ static int git_merge_config(const char *k, const char *v,
        }
 
        if (!strcmp(k, "merge.diffstat") || !strcmp(k, "merge.stat")) {
-               show_diffstat = git_config_bool(k, v);
+               show_diffstat = git_config_bool(k, v)
+                       ? MERGE_SHOW_DIFFSTAT : 0;
        } else if (!strcmp(k, "merge.verifysignatures")) {
                verify_signatures = git_config_bool(k, v);
        } else if (!strcmp(k, "pull.twohead")) {
index a1ebc6ad3328e074b105246f6bf5c41b063c17c9..6e72a2e9a438276cfdf942ee71f8645e05be5964 100644 (file)
@@ -143,6 +143,9 @@ static struct option pull_options[] = {
        OPT_PASSTHRU(0, "summary", &opt_diffstat, NULL,
                N_("(synonym to --stat)"),
                PARSE_OPT_NOARG | PARSE_OPT_HIDDEN),
+       OPT_PASSTHRU(0, "compact-summary", &opt_diffstat, NULL,
+               N_("show a compact-summary at the end of the merge"),
+               PARSE_OPT_NOARG),
        OPT_PASSTHRU(0, "log", &opt_log, N_("n"),
                N_("add (at most <n>) entries from shortlog to merge commit message"),
                PARSE_OPT_OPTARG),
index 2a8df292196468296a437152f242d4e0e5b0a4e1..2972922b6a2208e4de0be03ef61ba148166ad959 100755 (executable)
@@ -185,8 +185,19 @@ test_expect_success 'reject non-strategy with a git-merge-foo name' '
 test_expect_success 'merge c0 with c1' '
        echo "OBJID HEAD@{0}: merge c1: Fast-forward" >reflog.expected &&
 
+       cat >expect <<-\EOF &&
+       Updating FROM..TO
+       Fast-forward
+        file  | 2 +-
+        other | 9 +++++++++
+        2 files changed, 10 insertions(+), 1 deletion(-)
+        create mode 100644 other
+       EOF
+
        git reset --hard c0 &&
-       git merge c1 &&
+       git merge c1 >out &&
+       sed -e "1s/^Updating [0-9a-f.]*/Updating FROM..TO/" out >actual &&
+       test_cmp expect actual &&
        verify_merge file result.1 &&
        verify_head "$c1" &&
 
@@ -205,6 +216,21 @@ test_expect_success 'merge c0 with c1 with --ff-only' '
        verify_head "$c1"
 '
 
+test_expect_success 'the same merge with compact summary' '
+       cat >expect <<-\EOF &&
+       Updating FROM..TO
+       Fast-forward
+        file        | 2 +-
+        other (new) | 9 +++++++++
+        2 files changed, 10 insertions(+), 1 deletion(-)
+       EOF
+
+       git reset --hard c0 &&
+       git merge --compact-summary c1 >out &&
+       sed -e "1s/^Updating [0-9a-f.]*/Updating FROM..TO/" out >actual &&
+       test_cmp expect actual
+'
+
 test_debug 'git log --graph --decorate --oneline --all'
 
 test_expect_success 'merge from unborn branch' '