Created
January 28, 2009 12:33
-
-
Save nothingmuch/53926 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 4742ba64e7c20f7d60acdd411201f7aa971b462a Mon Sep 17 00:00:00 2001 | |
From: Yuval Kogman <nothingmuch@woobling.org> | |
Date: Wed, 28 Jan 2009 14:30:08 +0200 | |
Subject: [PATCH] Add --ff-only flag to git-merge | |
This patch adds an --ff-only flag to git-merge. When specified git-merge | |
will exit with an error whenver a merge will not be a simple fast | |
forward, similar to the default behavior of git push. | |
--- | |
builtin-merge.c | 6 ++++++ | |
t/t7600-merge.sh | 45 +++++++++++++++++++++++++++++++++++++++++++++ | |
2 files changed, 51 insertions(+), 0 deletions(-) | |
diff --git a/builtin-merge.c b/builtin-merge.c | |
index e4555b0..d37423b 100644 | |
--- a/builtin-merge.c | |
+++ b/builtin-merge.c | |
@@ -44,6 +44,7 @@ static const char * const builtin_merge_usage[] = { | |
static int show_diffstat = 1, option_log, squash; | |
static int option_commit = 1, allow_fast_forward = 1; | |
static int allow_trivial = 1, have_message; | |
+static int only_fast_forward; | |
static struct strbuf merge_msg; | |
static struct commit_list *remoteheads; | |
static unsigned char head[20], stash[20]; | |
@@ -167,6 +168,8 @@ static struct option builtin_merge_options[] = { | |
"perform a commit if the merge succeeds (default)"), | |
OPT_BOOLEAN(0, "ff", &allow_fast_forward, | |
"allow fast forward (default)"), | |
+ OPT_BOOLEAN(0, "ff-only", &only_fast_forward, | |
+ "allow only fast forward"), | |
OPT_CALLBACK('s', "strategy", &use_strategies, "strategy", | |
"merge strategy to use", option_parse_strategy), | |
OPT_CALLBACK('m', "message", &merge_msg, "message", | |
@@ -1012,6 +1015,9 @@ int cmd_merge(int argc, const char **argv, const char *prefix) | |
finish(o->sha1, msg.buf); | |
drop_save(); | |
return 0; | |
+ } else if ( only_fast_forward ) { | |
+ printf("Merge is non fast forward, aborting.\n"); | |
+ return 1; | |
} else if (!remoteheads->next && common->next) | |
; | |
/* | |
diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh | |
index e5b210b..6c2febc 100755 | |
--- a/t/t7600-merge.sh | |
+++ b/t/t7600-merge.sh | |
@@ -234,6 +234,8 @@ test_expect_success 'reject non-strategy with a git-merge-foo name' ' | |
test_must_fail git merge -s index c1 | |
' | |
+test_debug 'gitk --all' | |
+ | |
test_expect_success 'merge c0 with c1' ' | |
git reset --hard c0 && | |
git merge c1 && | |
@@ -243,6 +245,15 @@ test_expect_success 'merge c0 with c1' ' | |
test_debug 'gitk --all' | |
+test_expect_success 'merge c0 with c1 (fast forward only)' ' | |
+ git reset --hard c0 && | |
+ git merge --ff-only c1 && | |
+ verify_merge file result.1 && | |
+ verify_head "$c1" | |
+' | |
+ | |
+test_debug 'gitk --all' | |
+ | |
test_expect_success 'merge c1 with c2' ' | |
git reset --hard c1 && | |
test_tick && | |
@@ -253,6 +264,14 @@ test_expect_success 'merge c1 with c2' ' | |
test_debug 'gitk --all' | |
+test_expect_success 'merge c1 with c2' ' | |
+ git reset --hard c1 && | |
+ test_tick && | |
+ test_must_fail git merge --ff-only c2 | |
+' | |
+ | |
+test_debug 'gitk --all' | |
+ | |
test_expect_success 'merge c1 with c2 and c3' ' | |
git reset --hard c1 && | |
test_tick && | |
@@ -263,6 +282,14 @@ test_expect_success 'merge c1 with c2 and c3' ' | |
test_debug 'gitk --all' | |
+test_expect_success 'merge c1 with c2 and c3 (fast forward only' ' | |
+ git reset --hard c1 && | |
+ test_tick && | |
+ test_must_fail git merge --ff-only c2 c3 | |
+' | |
+ | |
+test_debug 'gitk --all' | |
+ | |
test_expect_success 'merge c0 with c1 (no-commit)' ' | |
git reset --hard c0 && | |
git merge --no-commit c1 && | |
@@ -470,6 +497,15 @@ test_expect_success 'merge c1 with c0, c2, c0, and c1' ' | |
test_debug 'gitk --all' | |
+test_expect_success 'merge fast forward only' ' | |
+ git reset --hard c1 && | |
+ git config branch.master.mergeoptions "" && | |
+ test_tick && | |
+ test_must_fail git merge --ff-only c0 c2 c0 c1 | |
+' | |
+ | |
+test_debug 'gitk --all' | |
+ | |
test_expect_success 'merge c1 with c0, c2, c0, and c1' ' | |
git reset --hard c1 && | |
git config branch.master.mergeoptions "" && | |
@@ -481,6 +517,15 @@ test_expect_success 'merge c1 with c0, c2, c0, and c1' ' | |
test_debug 'gitk --all' | |
+test_expect_success 'merge fast forward only' ' | |
+ git reset --hard c1 && | |
+ git config branch.master.mergeoptions "" && | |
+ test_tick && | |
+ test_must_fail git merge --ff-only c1 c2 | |
+' | |
+ | |
+test_debug 'gitk --all' | |
+ | |
test_expect_success 'merge c1 with c1 and c2' ' | |
git reset --hard c1 && | |
git config branch.master.mergeoptions "" && | |
-- | |
1.6.1+GitX |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment