Browse Source

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>
stable-3.3
Stefan Lay 11 years ago committed by Gerrit Code Review @ Eclipse.org
parent
commit
dcd0dd4d9e
  1. 87
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashApplyCommandTest.java
  2. 1
      org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java

87
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashApplyCommandTest.java

@ -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");

1
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

Loading…
Cancel
Save