]> source.dussan.org Git - jgit.git/commitdiff
Check for FF_ONLY merges correctly 52/9852/2
authorRobin Rosenberg <robin.rosenberg@dewire.com>
Tue, 22 Jan 2013 23:04:08 +0000 (00:04 +0100)
committerRobin Rosenberg <robin.rosenberg@dewire.com>
Mon, 28 Jan 2013 23:48:56 +0000 (00:48 +0100)
Bug: 398192
Change-Id: I1253c0ea0632185bbf9f77e32f13ba5842a6e18e

org.eclipse.jgit.test/tst/org/eclipse/jgit/api/MergeCommandTest.java
org.eclipse.jgit/src/org/eclipse/jgit/api/MergeCommand.java

index 589845ef678803fbf8e9fd5e3efc24d304d531b8..df3cf58424d6f421394f75dc6dbe788d38eeb835 100644 (file)
@@ -52,6 +52,7 @@ import static org.junit.Assert.fail;
 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 class MergeCommandTest extends RepositoryTestCase {
                }
        }
 
+       @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 class MergeCommandTest extends RepositoryTestCase {
                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);
index 2d3a6e18779a7bad02be2279e15605e5eadc0bd7..aacc970e5ee18240264f6dac9f737ebbfcf8c4ba 100644 (file)
@@ -269,7 +269,7 @@ public class MergeCommand extends GitCommand<MergeResult> {
                                                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 class MergeCommand extends GitCommand<MergeResult> {
                                                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);