Skip to content

Commit 36a45b4

Browse files
committed
Merge branch 'mg/merge-ff-config'
* mg/merge-ff-config: tests: check git does not barf on merge.ff values for future versions of git merge: introduce merge.ff configuration variable Conflicts: t/t7600-merge.sh
2 parents 6c7471b + 8c5cea0 commit 36a45b4

File tree

3 files changed

+77
-6
lines changed

3 files changed

+77
-6
lines changed

Documentation/merge-config.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,16 @@ merge.defaultToUpstream::
1616
to their corresponding remote tracking branches, and the tips of
1717
these tracking branches are merged.
1818

19+
merge.ff::
20+
By default, git does not create an extra merge commit when merging
21+
a commit that is a descendant of the current commit. Instead, the
22+
tip of the current branch is fast-forwarded. When set to `false`,
23+
this variable tells git to create an extra merge commit in such
24+
a case (equivalent to giving the `--no-ff` option from the command
25+
line). When set to `only`, only such fast-forward merges are
26+
allowed (equivalent to giving the `--ff-only` option from the
27+
command line).
28+
1929
merge.log::
2030
In addition to branch names, populate the log message with at
2131
most the specified number of one-line descriptions from the

builtin/merge.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,15 @@ static int git_merge_config(const char *k, const char *v, void *cb)
550550
if (is_bool && shortlog_len)
551551
shortlog_len = DEFAULT_MERGE_LOG_LEN;
552552
return 0;
553+
} else if (!strcmp(k, "merge.ff")) {
554+
int boolval = git_config_maybe_bool(k, v);
555+
if (0 <= boolval) {
556+
allow_fast_forward = boolval;
557+
} else if (v && !strcmp(v, "only")) {
558+
allow_fast_forward = 1;
559+
fast_forward_only = 1;
560+
} /* do not barf on values from future versions of git */
561+
return 0;
553562
} else if (!strcmp(k, "merge.defaulttoupstream")) {
554563
default_to_upstream = git_config_bool(k, v);
555564
return 0;

t/t7600-merge.sh

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ printf '%s\n' 1 2 3 4 5 6 7 8 '9 X' >file.9
3535
printf '%s\n' '1 X' 2 3 4 5 6 7 8 9 >result.1
3636
printf '%s\n' '1 X' 2 3 4 '5 X' 6 7 8 9 >result.1-5
3737
printf '%s\n' '1 X' 2 3 4 '5 X' 6 7 8 '9 X' >result.1-5-9
38+
>empty
3839

3940
create_merge_msgs () {
4041
echo "Merge commit 'c2'" >msg.1-5 &&
@@ -224,12 +225,28 @@ test_expect_success 'merge c1 with c2 and c3' '
224225

225226
test_debug 'git log --graph --decorate --oneline --all'
226227

227-
test_expect_success 'failing merges with --ff-only' '
228+
test_expect_success 'merges with --ff-only' '
228229
git reset --hard c1 &&
229230
test_tick &&
230231
test_must_fail git merge --ff-only c2 &&
231232
test_must_fail git merge --ff-only c3 &&
232-
test_must_fail git merge --ff-only c2 c3
233+
test_must_fail git merge --ff-only c2 c3 &&
234+
git reset --hard c0 &&
235+
git merge c3 &&
236+
verify_head $c3
237+
'
238+
239+
test_expect_success 'merges with merge.ff=only' '
240+
git reset --hard c1 &&
241+
test_tick &&
242+
test_when_finished "git config --unset merge.ff" &&
243+
git config merge.ff only &&
244+
test_must_fail git merge c2 &&
245+
test_must_fail git merge c3 &&
246+
test_must_fail git merge c2 c3 &&
247+
git reset --hard c0 &&
248+
git merge c3 &&
249+
verify_head $c3
233250
'
234251

235252
test_expect_success 'merge c0 with c1 (no-commit)' '
@@ -338,10 +355,11 @@ test_expect_success 'merge c1 with c2 (log in config)' '
338355
'
339356

340357
test_expect_success 'merge c1 with c2 (log in config gets overridden)' '
341-
(
342-
git config --remove-section branch.master
343-
git config --remove-section merge
344-
)
358+
test_when_finished "git config --remove-section branch.master" &&
359+
test_when_finished "git config --remove-section merge" &&
360+
test_might_fail git config --remove-section branch.master &&
361+
test_might_fail git config --remove-section merge &&
362+
345363
git reset --hard c1 &&
346364
git merge c2 &&
347365
git show -s --pretty=tformat:%s%n%b >expect &&
@@ -446,7 +464,41 @@ test_expect_success 'merge c0 with c1 (no-ff)' '
446464

447465
test_debug 'git log --graph --decorate --oneline --all'
448466

467+
test_expect_success 'merge c0 with c1 (merge.ff=false)' '
468+
git reset --hard c0 &&
469+
git config merge.ff false &&
470+
test_tick &&
471+
git merge c1 &&
472+
git config --remove-section merge &&
473+
verify_merge file result.1 &&
474+
verify_parents $c0 $c1
475+
'
476+
test_debug 'git log --graph --decorate --oneline --all'
477+
478+
test_expect_success 'combine branch.master.mergeoptions with merge.ff' '
479+
git reset --hard c0 &&
480+
git config branch.master.mergeoptions --ff &&
481+
git config merge.ff false &&
482+
test_tick &&
483+
git merge c1 &&
484+
git config --remove-section "branch.master" &&
485+
git config --remove-section "merge" &&
486+
verify_merge file result.1 &&
487+
verify_parents "$c0"
488+
'
489+
490+
test_expect_success 'tolerate unknown values for merge.ff' '
491+
git reset --hard c0 &&
492+
git config merge.ff something-new &&
493+
test_tick &&
494+
git merge c1 2>message &&
495+
git config --remove-section "merge" &&
496+
verify_head "$c1" &&
497+
test_cmp empty message
498+
'
499+
449500
test_expect_success 'combining --squash and --no-ff is refused' '
501+
git reset --hard c0 &&
450502
test_must_fail git merge --squash --no-ff c1 &&
451503
test_must_fail git merge --no-ff --squash c1
452504
'

0 commit comments

Comments
 (0)