Junio C Hamano <gitster@xxxxxxxxx> writes: > In any case, your test exposed an ancient breakage ever since the > per-branch mergeoptions was introduced back when git-merge was a shell > script (aec7b36 (git-merge: add support for branch.<name>.mergeoptions, > 2007-09-24). > > -- >8 -- > Subject: [PATCH] merge: fix branch.<name>.mergeoptions > ... And then on top of that fix, we can do this. I have a seemingly unrelated change to the existing test but that was because it only made sure that the --ff-only option made the command fail when it should fail, without making sure that it does not interfere when it should succeed. A typical symptom of "showing off shiny new toy because I am too excited" developer disease, I would guess. I didn't want to forget to fix it. -- >8 -- Subject: [PATCH] merge: introduce merge.ff configuration variable This variable gives the default setting for --ff, --no-ff or --ff-only options of "git merge" command. Helped-by: Michael Grubb <devel@xxxxxxxxxxxxx> Helped-by: Jonathan Nieder <jrnieder@xxxxxxxxx> Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- * If we were doing the command line option of "merge" from scratch today, we probably would have done --ff, --ff=no, and --ff=only, instead of a separate --ff-only. We could still add the latter two as a consistency synonyms without deprecating anything, though. Documentation/merge-config.txt | 10 +++++++++ builtin/merge.c | 9 ++++++++ t/t7600-merge.sh | 43 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/Documentation/merge-config.txt b/Documentation/merge-config.txt index 8920258..861bd6f 100644 --- a/Documentation/merge-config.txt +++ b/Documentation/merge-config.txt @@ -16,6 +16,16 @@ merge.defaultToUpstream:: to their corresponding remote tracking branches, and the tips of these tracking branches are merged. +merge.ff:: + By default, git does not create an extra merge commit when merging + a commit that is a descendant of the current commit. Instead, the + tip of the current branch is fast-forwarded. When set to `false`, + this variable tells git to create an extra merge commit in such + a case (equivalent to giving the `--no-ff` option from the command + line). When set to `only`, only such fast-forward merges are + allowed (equivalent to giving the `--ff-only` option from the + command line). + merge.log:: In addition to branch names, populate the log message with at most the specified number of one-line descriptions from the diff --git a/builtin/merge.c b/builtin/merge.c index 4fa789a..1c3ff13 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -550,6 +550,15 @@ static int git_merge_config(const char *k, const char *v, void *cb) if (is_bool && shortlog_len) shortlog_len = DEFAULT_MERGE_LOG_LEN; return 0; + } else if (!strcmp(k, "merge.ff")) { + int boolval = git_config_maybe_bool(k, v); + if (0 <= boolval) { + allow_fast_forward = boolval; + } else if (v && !strcmp(v, "only")) { + allow_fast_forward = 1; + fast_forward_only = 1; + } /* do not barf on values from future versions of git */ + return 0; } else if (!strcmp(k, "merge.defaulttoupstream")) { default_to_upstream = git_config_bool(k, v); return 0; diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh index 5463f87..4f1d4eb 100755 --- a/t/t7600-merge.sh +++ b/t/t7600-merge.sh @@ -225,12 +225,28 @@ test_expect_success 'merge c1 with c2 and c3' ' test_debug 'git log --graph --decorate --oneline --all' -test_expect_success 'failing merges with --ff-only' ' +test_expect_success 'merges with --ff-only' ' git reset --hard c1 && test_tick && test_must_fail git merge --ff-only c2 && test_must_fail git merge --ff-only c3 && - test_must_fail git merge --ff-only c2 c3 + test_must_fail git merge --ff-only c2 c3 && + git reset --hard c0 && + git merge c3 && + verify_head $c3 +' + +test_expect_success 'merges with merge.ff=only' ' + git reset --hard c1 && + test_tick && + test_when_finished "git config --unset merge.ff" && + git config merge.ff only && + test_must_fail git merge c2 && + test_must_fail git merge c3 && + test_must_fail git merge c2 c3 && + git reset --hard c0 && + git merge c3 && + verify_head $c3 ' test_expect_success 'merge c0 with c1 (no-commit)' ' @@ -447,6 +463,29 @@ test_expect_success 'merge c0 with c1 (no-ff)' ' test_debug 'git log --graph --decorate --oneline --all' +test_expect_success 'merge c0 with c1 (merge.ff=false)' ' + git reset --hard c0 && + git config merge.ff false && + test_tick && + git merge c1 && + git config --remove-section merge && + verify_merge file result.1 && + verify_parents $c0 $c1 +' +test_debug 'git log --graph --decorate --oneline --all' + +test_expect_success 'combine branch.master.mergeoptions with merge.ff' ' + git reset --hard c0 && + git config branch.master.mergeoptions --ff + git config merge.ff false + test_tick && + git merge c1 && + git config --remove-section "branch.master" && + git config --remove-section "merge" && + verify_merge file result.1 && + verify_parents "$c0" +' + test_expect_success 'combining --squash and --no-ff is refused' ' test_must_fail git merge --squash --no-ff c1 && test_must_fail git merge --no-ff --squash c1 -- 1.7.5.1.268.gce5bd -- 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