Git fork

Merge branch 'jc/merge-compact-summary'

"git merge/pull" has been taught the "--compact-summary" option to
use the compact-summary format, intead of diffstat, when showing
the summary of the incoming changes.

* jc/merge-compact-summary:
merge/pull: extend merge.stat configuration variable to cover --compact-summary
merge/pull: add the "--compact-summary" option

+154 -8
+12 -2
Documentation/config/merge.adoc
··· 81 81 attributes" in linkgit:gitattributes[5]. 82 82 83 83 `merge.stat`:: 84 - Whether to print the diffstat between `ORIG_HEAD` and the merge result 85 - at the end of the merge. True by default. 84 + What, if anything, to print between `ORIG_HEAD` and the merge result 85 + at the end of the merge. Possible values are: 86 + + 87 + -- 88 + `false`;; Show nothing. 89 + `true`;; Show `git diff --diffstat --summary ORIG_HEAD`. 90 + `compact`;; Show `git diff --compact-summary ORIG_HEAD`. 91 + -- 92 + + 93 + but any unrecognised value (e.g., a value added by a future version of 94 + Git) is taken as `true` instead of triggering an error. Defaults to 95 + `true`. 86 96 87 97 `merge.autoStash`:: 88 98 When set to `true`, automatically create a temporary stash entry
+1 -1
Documentation/git-merge.adoc
··· 9 9 SYNOPSIS 10 10 -------- 11 11 [synopsis] 12 - git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit] 12 + git merge [-n] [--stat] [--compact-summary] [--no-commit] [--squash] [--[no-]edit] 13 13 [--no-verify] [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]] 14 14 [--[no-]allow-unrelated-histories] 15 15 [--[no-]rerere-autoupdate] [-m <msg>] [-F <file>]
+3
Documentation/merge-options.adoc
··· 113 113 With `-n` or `--no-stat` do not show a diffstat at the end of the 114 114 merge. 115 115 116 + `--compact-summary`:: 117 + Show a compact-summary at the end of the merge. 118 + 116 119 `--squash`:: 117 120 `--no-squash`:: 118 121 Produce the working tree and index state as if a real merge
+62 -4
builtin/merge.c
··· 69 69 NULL 70 70 }; 71 71 72 - static int show_diffstat = 1, shortlog_len = -1, squash; 72 + #define MERGE_SHOW_DIFFSTAT 1 73 + #define MERGE_SHOW_COMPACTSUMMARY 2 74 + 75 + static int show_diffstat = MERGE_SHOW_DIFFSTAT, shortlog_len = -1, squash; 73 76 static int option_commit = -1; 74 77 static int option_edit = -1; 75 78 static int allow_trivial = 1, have_message, verify_signatures; ··· 243 246 return 0; 244 247 } 245 248 249 + static int option_parse_compact_summary(const struct option *opt, 250 + const char *name UNUSED, int unset) 251 + { 252 + int *setting = opt->value; 253 + 254 + if (unset) 255 + *setting = 0; 256 + else 257 + *setting = MERGE_SHOW_COMPACTSUMMARY; 258 + return 0; 259 + } 260 + 246 261 static struct option builtin_merge_options[] = { 247 262 OPT_SET_INT('n', NULL, &show_diffstat, 248 263 N_("do not show a diffstat at the end of the merge"), 0), 249 264 OPT_BOOL(0, "stat", &show_diffstat, 250 265 N_("show a diffstat at the end of the merge")), 251 266 OPT_BOOL(0, "summary", &show_diffstat, N_("(synonym to --stat)")), 267 + OPT_CALLBACK_F(0, "compact-summary", &show_diffstat, N_("compact-summary"), 268 + N_("show a compact-summary at the end of the merge"), 269 + PARSE_OPT_NOARG, 270 + option_parse_compact_summary), 252 271 { 253 272 .type = OPTION_INTEGER, 254 273 .long_name = "log", ··· 494 513 struct diff_options opts; 495 514 repo_diff_setup(the_repository, &opts); 496 515 init_diffstat_widths(&opts); 497 - opts.output_format |= 498 - DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT; 516 + 517 + switch (show_diffstat) { 518 + case MERGE_SHOW_DIFFSTAT: /* 1 */ 519 + opts.output_format |= 520 + DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT; 521 + break; 522 + case MERGE_SHOW_COMPACTSUMMARY: /* 2 */ 523 + opts.output_format |= DIFF_FORMAT_DIFFSTAT; 524 + opts.flags.stat_with_summary = 1; 525 + break; 526 + default: 527 + break; 528 + } 499 529 opts.detect_rename = DIFF_DETECT_RENAME; 500 530 diff_setup_done(&opts); 501 531 diff_tree_oid(head, new_head, "", &opts); ··· 643 673 } 644 674 645 675 if (!strcmp(k, "merge.diffstat") || !strcmp(k, "merge.stat")) { 646 - show_diffstat = git_config_bool(k, v); 676 + int val = git_parse_maybe_bool_text(v); 677 + switch (val) { 678 + case 0: 679 + show_diffstat = 0; 680 + break; 681 + case 1: 682 + show_diffstat = MERGE_SHOW_DIFFSTAT; 683 + break; 684 + default: 685 + if (!strcmp(v, "compact")) 686 + show_diffstat = MERGE_SHOW_COMPACTSUMMARY; 687 + /* 688 + * We do not need to have an explicit 689 + * 690 + * else if (!strcmp(v, "diffstat")) 691 + * show_diffstat = MERGE_SHOW_DIFFSTAT; 692 + * 693 + * here, because the catch-all uses the 694 + * diffstat style anyway. 695 + */ 696 + else 697 + /* 698 + * A setting from a future? It is not an 699 + * error grave enough to fail the command. 700 + * proceed using the default one. 701 + */ 702 + show_diffstat = MERGE_SHOW_DIFFSTAT; 703 + break; 704 + } 647 705 } else if (!strcmp(k, "merge.verifysignatures")) { 648 706 verify_signatures = git_config_bool(k, v); 649 707 } else if (!strcmp(k, "pull.twohead")) {
+3
builtin/pull.c
··· 143 143 OPT_PASSTHRU(0, "summary", &opt_diffstat, NULL, 144 144 N_("(synonym to --stat)"), 145 145 PARSE_OPT_NOARG | PARSE_OPT_HIDDEN), 146 + OPT_PASSTHRU(0, "compact-summary", &opt_diffstat, NULL, 147 + N_("show a compact-summary at the end of the merge"), 148 + PARSE_OPT_NOARG), 146 149 OPT_PASSTHRU(0, "log", &opt_log, N_("n"), 147 150 N_("add (at most <n>) entries from shortlog to merge commit message"), 148 151 PARSE_OPT_OPTARG),
+73 -1
t/t7600-merge.sh
··· 185 185 test_expect_success 'merge c0 with c1' ' 186 186 echo "OBJID HEAD@{0}: merge c1: Fast-forward" >reflog.expected && 187 187 188 + cat >expect <<-\EOF && 189 + Updating FROM..TO 190 + Fast-forward 191 + file | 2 +- 192 + other | 9 +++++++++ 193 + 2 files changed, 10 insertions(+), 1 deletion(-) 194 + create mode 100644 other 195 + EOF 196 + 188 197 git reset --hard c0 && 189 - git merge c1 && 198 + git merge c1 >out && 199 + sed -e "1s/^Updating [0-9a-f.]*/Updating FROM..TO/" out >actual && 200 + test_cmp expect actual && 190 201 verify_merge file result.1 && 191 202 verify_head "$c1" && 192 203 ··· 203 214 git merge --ff-only HEAD c0 c1 && 204 215 verify_merge file result.1 && 205 216 verify_head "$c1" 217 + ' 218 + 219 + test_expect_success 'the same merge with merge.stat=diffstat' ' 220 + cat >expect <<-\EOF && 221 + Updating FROM..TO 222 + Fast-forward 223 + file | 2 +- 224 + other | 9 +++++++++ 225 + 2 files changed, 10 insertions(+), 1 deletion(-) 226 + create mode 100644 other 227 + EOF 228 + 229 + git reset --hard c0 && 230 + git -c merge.stat=diffstat merge c1 >out && 231 + sed -e "1s/^Updating [0-9a-f.]*/Updating FROM..TO/" out >actual && 232 + test_cmp expect actual 233 + ' 234 + 235 + test_expect_success 'the same merge with compact summary' ' 236 + cat >expect <<-\EOF && 237 + Updating FROM..TO 238 + Fast-forward 239 + file | 2 +- 240 + other (new) | 9 +++++++++ 241 + 2 files changed, 10 insertions(+), 1 deletion(-) 242 + EOF 243 + 244 + git reset --hard c0 && 245 + git merge --compact-summary c1 >out && 246 + sed -e "1s/^Updating [0-9a-f.]*/Updating FROM..TO/" out >actual && 247 + test_cmp expect actual 248 + ' 249 + 250 + test_expect_success 'the same merge with compact summary' ' 251 + cat >expect <<-\EOF && 252 + Updating FROM..TO 253 + Fast-forward 254 + file | 2 +- 255 + other (new) | 9 +++++++++ 256 + 2 files changed, 10 insertions(+), 1 deletion(-) 257 + EOF 258 + 259 + git reset --hard c0 && 260 + git merge --compact-summary c1 >out && 261 + sed -e "1s/^Updating [0-9a-f.]*/Updating FROM..TO/" out >actual && 262 + test_cmp expect actual 263 + ' 264 + 265 + test_expect_success 'the same merge with merge.stat=compact' ' 266 + cat >expect <<-\EOF && 267 + Updating FROM..TO 268 + Fast-forward 269 + file | 2 +- 270 + other (new) | 9 +++++++++ 271 + 2 files changed, 10 insertions(+), 1 deletion(-) 272 + EOF 273 + 274 + git reset --hard c0 && 275 + git -c merge.stat=compact merge c1 >out && 276 + sed -e "1s/^Updating [0-9a-f.]*/Updating FROM..TO/" out >actual && 277 + test_cmp expect actual 206 278 ' 207 279 208 280 test_debug 'git log --graph --decorate --oneline --all'