summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Lay <stefan.lay@sap.com>2013-11-27 17:10:39 +0100
committerGerrit Code Review @ Eclipse.org <gerrit@eclipse.org>2013-11-29 10:36:53 -0500
commitdcd0dd4d9ec0ffebb5bdbbe9ea819316427b79ca (patch)
treec252c6b0f8aa0fcbdef5251b86eb7862e5adc897
parentec0d78d0939ee8ce30bd349bd885186c13d3b645 (diff)
downloadjgit-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.java87
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java1
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