diff options
author | Stefan Lay <stefan.lay@sap.com> | 2013-11-27 17:10:39 +0100 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org <gerrit@eclipse.org> | 2013-11-29 10:36:53 -0500 |
commit | dcd0dd4d9ec0ffebb5bdbbe9ea819316427b79ca (patch) | |
tree | c252c6b0f8aa0fcbdef5251b86eb7862e5adc897 | |
parent | ec0d78d0939ee8ce30bd349bd885186c13d3b645 (diff) | |
download | jgit-dcd0dd4d9ec0ffebb5bdbbe9ea819316427b79ca.tar.gz jgit-dcd0dd4d9ec0ffebb5bdbbe9ea819316427b79ca.zip |
Fix applying stash on other commit
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>
-rw-r--r-- | org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashApplyCommandTest.java | 87 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java | 1 |
2 files changed, 88 insertions, 0 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashApplyCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashApplyCommandTest.java index 16e80f1bfa..2834100389 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashApplyCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashApplyCommandTest.java @@ -409,6 +409,93 @@ public class StashApplyCommandTest extends RepositoryTestCase { } @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"); git.add().addFilepattern(PATH).call(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java index 020a6dc5f2..73d64529b3 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java @@ -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 |