This patch teaches merge a new setting, merge.options, which is processed before any of the other merge configuration settings. It may be used to establish a default which can then be overridden by more specific branch.<name>.mergeoptions (or, obviously, command-line switches). Signed-off-by: Jay Soffian <jaysoffian@xxxxxxxxx> --- Documentation/git-merge.txt | 11 +++++-- builtin-merge.c | 10 ++++++ t/t7600-merge.sh | 69 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 3 deletions(-) diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt index f7be584..3cb06e7 100644 --- a/Documentation/git-merge.txt +++ b/Documentation/git-merge.txt @@ -47,10 +47,15 @@ CONFIGURATION ------------- include::merge-config.txt[] +merge.options:: + Sets default options for merging. The syntax and supported options are + equal to that of 'git-merge'. Arguments are split by spaces, and may be + quoted in the same way as alias.* config options. + branch.<name>.mergeoptions:: - Sets default options for merging into branch <name>. The syntax and - supported options are equal to that of 'git-merge', but option values - containing whitespace characters are currently not supported. + Sets default options for merging into branch <name>. This setting is + handled after `merge.options`, so it may be used to override any + settings appearing there. The syntax is identical to `merge.options`. HOW MERGE WORKS --------------- diff --git a/builtin-merge.c b/builtin-merge.c index 504f2be..1f124b3 100644 --- a/builtin-merge.c +++ b/builtin-merge.c @@ -447,6 +447,15 @@ cleanup: strbuf_release(&bname); } +static int git_merge_config_default(const char *k, const char *v, void *cb) +{ + if (!strcmp(k, "merge.options")) { + if (git_config_option_string(builtin_merge_options, 0, k, v)) + die("Bad merge.options string"); + } + return 0; +} + static int git_merge_config(const char *k, const char *v, void *cb) { if (branch && !prefixcmp(k, "branch.") && @@ -838,6 +847,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) if (is_null_sha1(head)) head_invalid = 1; + git_config(git_merge_config_default, NULL); git_config(git_merge_config, NULL); /* for color.ui */ diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh index 9db8bb4..aaecdab 100755 --- a/t/t7600-merge.sh +++ b/t/t7600-merge.sh @@ -367,6 +367,16 @@ test_expect_success 'merge c1 with c2 (no-commit in config)' ' test_debug 'gitk --all' +test_expect_success 'merge c1 with c2 (no-commit in merge.options)' ' + git reset --hard c1 && + with_config merge.options --no-commit -- merge c2 && + verify_merge file result.1-5 && + verify_head $c1 && + verify_mergeheads $c2 +' + +test_debug 'gitk --all' + test_expect_success 'merge c1 with c2 (squash in config)' ' git reset --hard c1 && with_config branch.master.mergeoptions --squash -- \ @@ -379,6 +389,17 @@ test_expect_success 'merge c1 with c2 (squash in config)' ' test_debug 'gitk --all' +test_expect_success 'merge c1 with c2 (squash in merge.options)' ' + git reset --hard c1 && + with_config merge.options --squash -- merge c2 && + verify_merge file result.1-5 && + verify_head $c1 && + verify_no_mergehead && + verify_diff squash.1-5 .git/SQUASH_MSG "[OOPS] bad squash message" +' + +test_debug 'gitk --all' + test_expect_success 'override config option -n with --summary' ' git reset --hard c1 && test_tick && @@ -425,6 +446,54 @@ test_expect_success 'override config option --stat' ' test_debug 'gitk --all' +test_expect_success 'override merge.options -n with branch mergeoptions --summary' ' + git reset --hard c1 && + test_tick && + with_config merge.options -n branch.master.mergeoptions --summary -- \ + merge c2 >diffstat.txt && + verify_merge file result.1-5 msg.1-5 && + verify_parents $c1 $c2 && + if ! grep "^ file | *2 +-$" diffstat.txt + then + echo "[OOPS] diffstat was not generated with --summary" + false + fi +' + +test_debug 'gitk --all' + +test_expect_success 'override merge.options -n with branch mergeoptions --stat' ' + git reset --hard c1 && + test_tick && + with_config merge.options -n branch.master.mergeoptions --stat -- \ + merge c2 >diffstat.txt && + verify_merge file result.1-5 msg.1-5 && + verify_parents $c1 $c2 && + if ! grep "^ file | *2 +-$" diffstat.txt + then + echo "[OOPS] diffstat was not generated with --stat" + false + fi +' + +test_debug 'gitk --all' + +test_expect_success 'override merge.options --stat' ' + git reset --hard c1 && + test_tick && + with_config merge.options --stat branch.master.mergeoptions -n -- \ + merge c2 >diffstat.txt && + verify_merge file result.1-5 msg.1-5 && + verify_parents $c1 $c2 && + if grep "^ file | *2 +-$" diffstat.txt + then + echo "[OOPS] diffstat was generated" + false + fi +' + +test_debug 'gitk --all' + test_expect_success 'merge c1 with c2 (override --no-commit)' ' git reset --hard c1 && test_tick && -- 1.6.2.rc2.332.g5d21b -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html