]> source.dussan.org Git - jgit.git/commitdiff
Fix applying stash on other commit 80/18980/3
authorStefan Lay <stefan.lay@sap.com>
Wed, 27 Nov 2013 16:10:39 +0000 (17:10 +0100)
committerGerrit Code Review @ Eclipse.org <gerrit@eclipse.org>
Fri, 29 Nov 2013 15:36:53 +0000 (10:36 -0500)
Applying a stash on another commit failed because the merge base for the
cherry-pick of the stashed index state was not corectly set.

Bug: 422684
Change-Id: I9355352b2b9a7abefa3248ca3c17a9301177d0d6
Signed-off-by: Stefan Lay <stefan.lay@sap.com>
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashApplyCommandTest.java
org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java

index 16e80f1bfa5ac923bb621a02ab61cd5aa1af003d..2834100389a396d3597982aaf07ea7f6bf88e84e 100644 (file)
@@ -408,6 +408,93 @@ public class StashApplyCommandTest extends RepositoryTestCase {
                                read(PATH));
        }
 
+       @Test
+       public void stashedApplyOnOtherBranch() throws Exception {
+               writeTrashFile(PATH, "content\nmore content\n");
+               git.add().addFilepattern(PATH).call();
+               git.commit().setMessage("more content").call();
+               String path2 = "file2.txt";
+               File file2 = writeTrashFile(path2, "content\nmore content\n");
+               git.add().addFilepattern(PATH).call();
+               git.add().addFilepattern(path2).call();
+               git.commit().setMessage("even content").call();
+
+               String otherBranch = "otherBranch";
+               git.branchCreate().setName(otherBranch).call();
+
+               writeTrashFile(PATH, "master content");
+               git.add().addFilepattern(PATH).call();
+               git.commit().setMessage("even content").call();
+
+               git.checkout().setName(otherBranch).call();
+
+               writeTrashFile(PATH, "otherBranch content");
+               git.add().addFilepattern(PATH).call();
+               git.commit().setMessage("even more content").call();
+
+               writeTrashFile(path2, "content\nstashed change\nmore content\n");
+
+               RevCommit stashed = git.stashCreate().call();
+
+               assertNotNull(stashed);
+               assertEquals("content\nmore content\n", read(file2));
+               assertEquals("otherBranch content",
+                               read(committedFile));
+               assertTrue(git.status().call().isClean());
+
+               git.checkout().setName("master").call();
+               git.stashApply().call();
+               assertEquals("content\nstashed change\nmore content\n", read(file2));
+               assertEquals("master content",
+                               read(committedFile));
+       }
+
+       @Test
+       public void stashedApplyOnOtherBranchWithStagedChange() throws Exception {
+               writeTrashFile(PATH, "content\nmore content\n");
+               git.add().addFilepattern(PATH).call();
+               git.commit().setMessage("more content").call();
+               String path2 = "file2.txt";
+               File file2 = writeTrashFile(path2, "content\nmore content\n");
+               git.add().addFilepattern(PATH).call();
+               git.add().addFilepattern(path2).call();
+               git.commit().setMessage("even content").call();
+
+               String otherBranch = "otherBranch";
+               git.branchCreate().setName(otherBranch).call();
+
+               writeTrashFile(PATH, "master content");
+               git.add().addFilepattern(PATH).call();
+               git.commit().setMessage("even content").call();
+
+               git.checkout().setName(otherBranch).call();
+
+               writeTrashFile(PATH, "otherBranch content");
+               git.add().addFilepattern(PATH).call();
+               git.commit().setMessage("even more content").call();
+
+               writeTrashFile(path2,
+                               "content\nstashed change in index\nmore content\n");
+               git.add().addFilepattern(path2).call();
+               writeTrashFile(path2, "content\nstashed change\nmore content\n");
+
+               RevCommit stashed = git.stashCreate().call();
+
+               assertNotNull(stashed);
+               assertEquals("content\nmore content\n", read(file2));
+               assertEquals("otherBranch content", read(committedFile));
+               assertTrue(git.status().call().isClean());
+
+               git.checkout().setName("master").call();
+               git.stashApply().call();
+               assertEquals("content\nstashed change\nmore content\n", read(file2));
+               assertEquals(
+                               "[file.txt, mode:100644, content:master content]"
+                                               + "[file2.txt, mode:100644, content:content\nstashed change in index\nmore content\n]",
+                               indexState(CONTENT));
+               assertEquals("master content", read(committedFile));
+       }
+
        @Test
        public void workingDirectoryContentMerge() throws Exception {
                writeTrashFile(PATH, "content\nmore content\n");
index 020a6dc5f2e396daa459c1ce28af6942350d3e64..73d64529b30409307b931b780e4178ae13851deb 100644 (file)
@@ -185,6 +185,7 @@ public class StashApplyCommand extends GitCommand<ObjectId> {
                                                        .newMerger(repo, true);
                                        ixMerger.setCommitNames(new String[] { "stashed HEAD",
                                                        "HEAD", "stashed index" });
+                                       ixMerger.setBase(stashHeadCommit);
                                        boolean ok = ixMerger.merge(headCommit, stashIndexCommit);
                                        if (ok) {
                                                resetIndex(revWalk