]> source.dussan.org Git - jgit.git/commitdiff
Update HEAD in cherry-picking several commits 64/14164/3
authorHiroshi Tomita <tomykaira@gmail.com>
Sun, 30 Jun 2013 16:07:10 +0000 (01:07 +0900)
committerHiroshi Tomita <tomykaira@gmail.com>
Mon, 1 Jul 2013 13:37:48 +0000 (22:37 +0900)
Without update, index is wrongly detected to be dirty
when picking the second commit.

Change-Id: Idf47ecb33e8bd38340d760806d629f67be92d2d5
Signed-off-by: Hiroshi Tomita <tomykaira@gmail.com>
Bug: 411963

org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CherryPickCommandTest.java
org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java

index f66661a52fdc4c41250405a40c013726dc5f0d58..2668c116a0ca17e2ac7274f52925c22623925cab 100644 (file)
@@ -111,6 +111,42 @@ public class CherryPickCommandTest extends RepositoryTestCase {
                assertFalse(history.hasNext());
        }
 
+    @Test
+    public void testSequentialCherryPick() throws IOException, JGitInternalException,
+            GitAPIException {
+        Git git = new Git(db);
+
+        writeTrashFile("a", "first line\nsec. line\nthird line\n");
+        git.add().addFilepattern("a").call();
+        RevCommit firstCommit = git.commit().setMessage("create a").call();
+
+        writeTrashFile("a", "first line\nsec. line\nthird line\nfourth line\n");
+        git.add().addFilepattern("a").call();
+        RevCommit enlargingA = git.commit().setMessage("enlarged a").call();
+
+        writeTrashFile("a",
+                "first line\nsecond line\nthird line\nfourth line\n");
+        git.add().addFilepattern("a").call();
+        RevCommit fixingA = git.commit().setMessage("fixed a").call();
+
+        git.branchCreate().setName("side").setStartPoint(firstCommit).call();
+        checkoutBranch("refs/heads/side");
+
+        writeTrashFile("b", "nothing to do with a");
+        git.add().addFilepattern("b").call();
+        git.commit().setMessage("create b").call();
+
+        CherryPickResult result = git.cherryPick().include(enlargingA).include(fixingA).call();
+        assertEquals(CherryPickResult.CherryPickStatus.OK, result.getStatus());
+
+        Iterator<RevCommit> history = git.log().call().iterator();
+        assertEquals("fixed a", history.next().getFullMessage());
+        assertEquals("enlarged a", history.next().getFullMessage());
+        assertEquals("create b", history.next().getFullMessage());
+        assertEquals("create a", history.next().getFullMessage());
+        assertFalse(history.hasNext());
+    }
+
        @Test
        public void testCherryPickDirtyIndex() throws Exception {
                Git git = new Git(db);
index d5d95592960ac03c0df9017b9d2e5f9323a5d12a..2ebff14f9c789a56916596fb4a2ed961c9bb7a81 100644 (file)
@@ -122,9 +122,8 @@ public class CherryPickCommand extends GitCommand<CherryPickResult> {
                        if (headRef == null)
                                throw new NoHeadException(
                                                JGitText.get().commitOnRepoWithoutHEADCurrentlyNotSupported);
-                       RevCommit headCommit = revWalk.parseCommit(headRef.getObjectId());
 
-                       newHead = headCommit;
+                       newHead = revWalk.parseCommit(headRef.getObjectId());
 
                        // loop through all refs to be cherry-picked
                        for (Ref src : commits) {
@@ -156,12 +155,12 @@ public class CherryPickCommand extends GitCommand<CherryPickResult> {
                                merger.setBase(srcParent.getTree());
                                merger.setCommitNames(new String[] { "BASE", ourName,
                                                cherryPickName });
-                               if (merger.merge(headCommit, srcCommit)) {
-                                       if (AnyObjectId.equals(headCommit.getTree().getId(), merger
+                               if (merger.merge(newHead, srcCommit)) {
+                                       if (AnyObjectId.equals(newHead.getTree().getId(), merger
                                                        .getResultTreeId()))
                                                continue;
                                        DirCacheCheckout dco = new DirCacheCheckout(repo,
-                                                       headCommit.getTree(), repo.lockDirCache(),
+                                                       newHead.getTree(), repo.lockDirCache(),
                                                        merger.getResultTreeId());
                                        dco.setFailOnConflict(true);
                                        dco.checkout();