From 642ff2cd7dd6ae361e4993255ade89a32e20601f Mon Sep 17 00:00:00 2001 From: Robin Rosenberg Date: Wed, 23 Jan 2013 00:04:08 +0100 Subject: [PATCH] Check for FF_ONLY merges correctly Bug: 398192 Change-Id: I1253c0ea0632185bbf9f77e32f13ba5842a6e18e --- .../eclipse/jgit/api/MergeCommandTest.java | 39 +++++++++++++++++++ .../org/eclipse/jgit/api/MergeCommand.java | 4 +- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/MergeCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/MergeCommandTest.java index 589845ef6..df3cf5842 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/MergeCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/MergeCommandTest.java @@ -52,6 +52,7 @@ import java.io.File; import java.util.Iterator; +import org.eclipse.jgit.api.MergeCommand.FastForwardMode; import org.eclipse.jgit.api.MergeResult.MergeStatus; import org.eclipse.jgit.api.errors.InvalidMergeHeadsException; import org.eclipse.jgit.lib.Constants; @@ -203,6 +204,28 @@ public void testMultipleHeads() throws Exception { } } + @Test + public void testMergeCannotDoRequiredFastForward() throws Exception { + Git git = new Git(db); + + RevCommit first = git.commit().setMessage("first").call(); + createBranch(first, "refs/heads/side"); + + writeTrashFile("a", "a"); + git.add().addFilepattern("a").call(); + git.commit().setMessage("second").call(); + + checkoutBranch("refs/heads/side"); + writeTrashFile("b", "b"); + git.add().addFilepattern("b").call(); + git.commit().setMessage("third").call(); + + MergeResult result = git.merge().include(db.getRef(Constants.MASTER)) + .setFastForward(FastForwardMode.NO_FF) + .call(); + assertEquals(MergeStatus.ABORTED, result.getMergeStatus()); + } + @Theory public void testMergeSuccessAllStrategies(MergeStrategy mergeStrategy) throws Exception { @@ -1328,6 +1351,22 @@ public void testSquashMergeConflict() throws Exception { assertEquals(StatusCommandTest.set("file2"), stat.getConflicting()); } + @Test + public void testFastForwardOnly() throws Exception { + Git git = new Git(db); + RevCommit initialCommit = git.commit().setMessage("initial commit") + .call(); + createBranch(initialCommit, "refs/heads/branch1"); + git.commit().setMessage("second commit").call(); + checkoutBranch("refs/heads/branch1"); + + MergeCommand merge = git.merge(); + merge.setFastForward(FastForwardMode.FF_ONLY); + merge.include(db.getRef(Constants.MASTER)); + MergeResult result = merge.call(); + + assertEquals(MergeStatus.FAST_FORWARD, result.getMergeStatus()); + } private static void setExecutable(Git git, String path, boolean executable) { FS.DETECTED.setExecute( new File(git.getRepository().getWorkTree(), path), executable); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java index 2d3a6e187..aacc970e5 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java @@ -269,7 +269,7 @@ public MergeResult call() throws GitAPIException, NoHeadException, headCommit, srcCommit }, MergeStatus.ALREADY_UP_TO_DATE, mergeStrategy, null, null); } else if (revWalk.isMergedInto(headCommit, srcCommit) - && fastForwardMode == FastForwardMode.FF) { + && fastForwardMode != FastForwardMode.NO_FF) { // FAST_FORWARD detected: skip doing a real merge but only // update HEAD refLogMessage.append(": " + MergeStatus.FAST_FORWARD); //$NON-NLS-1$ @@ -300,7 +300,7 @@ public MergeResult call() throws GitAPIException, NoHeadException, headCommit, srcCommit }, mergeStatus, mergeStrategy, null, msg); } else { - if (fastForwardMode == FastForwardMode.FF_ONLY) { + if (fastForwardMode == FastForwardMode.NO_FF) { return new MergeResult(headCommit, srcCommit, new ObjectId[] { headCommit, srcCommit }, MergeStatus.ABORTED, mergeStrategy, null, null);