summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.test
diff options
context:
space:
mode:
authorDave Borowitz <dborowitz@google.com>2015-03-18 10:46:41 -0700
committerDave Borowitz <dborowitz@google.com>2015-03-23 13:03:31 -0700
commitf1a15f7eb09183124ea645a8bfc16a03d58fd385 (patch)
tree8583a1146018ef0534912f7709154804f6bb1b54 /org.eclipse.jgit.test
parentdd453f4185c8e7e9608605a35abd4ac4eaadba76 (diff)
downloadjgit-f1a15f7eb09183124ea645a8bfc16a03d58fd385.tar.gz
jgit-f1a15f7eb09183124ea645a8bfc16a03d58fd385.zip
TestRepository: Add a cherryPick method
CherryPickCommand only works on a non-bare repository, as it must modify the working tree and index in case of a merge conflict. In tests, being able to recover from a merge conflict is less important, as the caller should be able to control the full contents of files in advance of the cherry-pick. Change-Id: Ic332e44df1308b9336e884666b08c1f6db64513d
Diffstat (limited to 'org.eclipse.jgit.test')
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/junit/TestRepositoryTest.java80
1 files changed, 79 insertions, 1 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/junit/TestRepositoryTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/junit/TestRepositoryTest.java
index cefc779a27..fbb9eecdff 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/junit/TestRepositoryTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/junit/TestRepositoryTest.java
@@ -46,6 +46,7 @@ package org.eclipse.jgit.junit;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
@@ -55,9 +56,9 @@ import java.util.regex.Pattern;
import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectLoader;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Ref;
@@ -296,6 +297,83 @@ public class TestRepositoryTest {
assertEquals("refs/heads/master", ref.getTarget().getName());
}
+ @Test
+ public void cherryPick() throws Exception {
+ repo.updateRef("HEAD").link("refs/heads/master");
+ RevCommit head = tr.branch("master").commit()
+ .add("foo", "foo contents\n")
+ .create();
+ rw.parseBody(head);
+ RevCommit toPick = tr.commit()
+ .parent(tr.commit().create()) // Can't cherry-pick root.
+ .author(new PersonIdent("Cherrypick Author", "cpa@example.com",
+ tr.getClock(), tr.getTimeZone()))
+ .author(new PersonIdent("Cherrypick Committer", "cpc@example.com",
+ tr.getClock(), tr.getTimeZone()))
+ .message("message to cherry-pick")
+ .add("bar", "bar contents\n")
+ .create();
+ RevCommit result = tr.cherryPick(toPick);
+ rw.parseBody(result);
+
+ Ref headRef = tr.getRepository().getRef("HEAD");
+ assertEquals(result, headRef.getObjectId());
+ assertTrue(headRef.isSymbolic());
+ assertEquals("refs/heads/master", headRef.getLeaf().getName());
+
+ assertEquals(1, result.getParentCount());
+ assertEquals(head, result.getParent(0));
+ assertEquals(toPick.getAuthorIdent(), result.getAuthorIdent());
+
+ // Committer name/email matches default, and time was incremented.
+ assertEquals(new PersonIdent(head.getCommitterIdent(), new Date(0)),
+ new PersonIdent(result.getCommitterIdent(), new Date(0)));
+ assertTrue(toPick.getCommitTime() < result.getCommitTime());
+
+ assertEquals("message to cherry-pick", result.getFullMessage());
+ assertEquals("foo contents\n", blobAsString(result, "foo"));
+ assertEquals("bar contents\n", blobAsString(result, "bar"));
+ }
+
+ @Test
+ public void cherryPickWithContentMerge() throws Exception {
+ RevCommit base = tr.branch("HEAD").commit()
+ .add("foo", "foo contents\n\n")
+ .create();
+ tr.branch("HEAD").commit()
+ .add("foo", "foo contents\n\nlast line\n")
+ .create();
+ RevCommit toPick = tr.commit()
+ .message("message to cherry-pick")
+ .parent(base)
+ .add("foo", "changed foo contents\n\n")
+ .create();
+ RevCommit result = tr.cherryPick(toPick);
+ rw.parseBody(result);
+
+ assertEquals("message to cherry-pick", result.getFullMessage());
+ assertEquals("changed foo contents\n\nlast line\n",
+ blobAsString(result, "foo"));
+ }
+
+ @Test
+ public void cherryPickWithIdenticalContents() throws Exception {
+ RevCommit base = tr.branch("HEAD").commit().add("foo", "foo contents\n")
+ .create();
+ RevCommit head = tr.branch("HEAD").commit()
+ .parent(base)
+ .add("bar", "bar contents\n")
+ .create();
+ RevCommit toPick = tr.commit()
+ .parent(base)
+ .message("message to cherry-pick")
+ .add("bar", "bar contents\n")
+ .create();
+ assertNotEquals(head, toPick);
+ assertNull(tr.cherryPick(toPick));
+ assertEquals(head, repo.getRef("HEAD").getObjectId());
+ }
+
private String blobAsString(AnyObjectId treeish, String path)
throws Exception {
RevObject obj = tr.get(rw.parseTree(treeish), path);