summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.test
diff options
context:
space:
mode:
authorKonrad Kügler <swamblumat-eclipsebugs@yahoo.de>2014-05-16 18:42:44 +0200
committerKonrad Kügler <swamblumat-eclipsebugs@yahoo.de>2014-05-17 19:18:07 +0200
commitb84057ad629f4dfc0a94b6a273570a53ba5a9d0a (patch)
tree9159244012ff1e727c676ca1b29ab694d700825e /org.eclipse.jgit.test
parent2aa2b3af31e95b90c20794c727fc2e48b5f448e9 (diff)
downloadjgit-b84057ad629f4dfc0a94b6a273570a53ba5a9d0a.tar.gz
jgit-b84057ad629f4dfc0a94b6a273570a53ba5a9d0a.zip
Cherry-Pick: Support --mainline to pick merges
By specifying a mainline parent, a merge is cherry picked as if this parent was its only parent. If no mainline parent is given, cherry picking merges is not allowed, as before. Change-Id: I391cb73bf8f49e2df61428c17b40fae8c86a8b76 Signed-off-by: Konrad Kügler <swamblumat-eclipsebugs@yahoo.de>
Diffstat (limited to 'org.eclipse.jgit.test')
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CherryPickCommandTest.java58
1 files changed, 58 insertions, 0 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CherryPickCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CherryPickCommandTest.java
index 2668c116a0..df73435803 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CherryPickCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CherryPickCommandTest.java
@@ -46,6 +46,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import java.io.File;
import java.io.IOException;
@@ -55,11 +56,13 @@ import org.eclipse.jgit.api.CherryPickResult.CherryPickStatus;
import org.eclipse.jgit.api.ResetCommand.ResetType;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
+import org.eclipse.jgit.api.errors.MultipleParentsNotAllowedException;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.junit.RepositoryTestCase;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ReflogReader;
import org.eclipse.jgit.lib.RepositoryState;
import org.eclipse.jgit.merge.ResolveMerger.MergeFailureReason;
@@ -336,4 +339,59 @@ public class CherryPickCommandTest extends RepositoryTestCase {
.startsWith("cherry-pick: "));
}
}
+
+ /**
+ * Cherry-picking merge commit M onto T
+ * <pre>
+ * M
+ * |\
+ * C D
+ * |/
+ * T B
+ * | /
+ * A
+ * </pre>
+ * @throws Exception
+ */
+ @Test
+ public void testCherryPickMerge() throws Exception {
+ Git git = new Git(db);
+
+ commitFile("file", "1\n2\n3\n", "master");
+ commitFile("file", "1\n2\n3\n", "side");
+ checkoutBranch("refs/heads/side");
+ RevCommit commitD = commitFile("file", "1\n2\n3\n4\n5\n", "side2");
+ commitFile("file", "a\n2\n3\n", "side");
+ MergeResult mergeResult = git.merge().include(commitD).call();
+ ObjectId commitM = mergeResult.getNewHead();
+ checkoutBranch("refs/heads/master");
+ RevCommit commitT = commitFile("another", "t", "master");
+
+ try {
+ git.cherryPick().include(commitM).call();
+ fail("merges should not be cherry-picked by default");
+ } catch (MultipleParentsNotAllowedException e) {
+ // expected
+ }
+ try {
+ git.cherryPick().include(commitM).setMainlineParentNumber(3).call();
+ fail("specifying a non-existent parent should fail");
+ } catch (JGitInternalException e) {
+ // expected
+ assertTrue(e.getMessage().endsWith(
+ "does not have a parent number 3."));
+ }
+
+ CherryPickResult result = git.cherryPick().include(commitM)
+ .setMainlineParentNumber(1).call();
+ assertEquals(CherryPickStatus.OK, result.getStatus());
+ checkFile(new File(db.getWorkTree(), "file"), "1\n2\n3\n4\n5\n");
+
+ git.reset().setMode(ResetType.HARD).setRef(commitT.getName()).call();
+
+ CherryPickResult result2 = git.cherryPick().include(commitM)
+ .setMainlineParentNumber(2).call();
+ assertEquals(CherryPickStatus.OK, result2.getStatus());
+ checkFile(new File(db.getWorkTree(), "file"), "a\n2\n3\n");
+ }
}