Fix StashApplyCommand for stashes containing untracked changes.
If there are untracked changes, apply only the untracked tree
after a successful merge. The merge tree from merging untracked
with HEAD would also contain files already reset before (changes
in tracked files) and try to reset those again,leading to false
checkout conflicts.
Bug: 505804
Change-Id: Iaced4d277623334d11e3d1cca5969590d7c5093e
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
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 ce235a7..8627115 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
@@ -736,4 +736,21 @@ public void untrackedFileConflictsWithWorkingDirectory()
}
assertEquals("working-directory", read(path));
}
+
+ @Test
+ public void untrackedAndTrackedChanges() throws Exception {
+ writeTrashFile(PATH, "changed");
+ String path = "untracked.txt";
+ writeTrashFile(path, "untracked");
+ git.stashCreate().setIncludeUntracked(true).call();
+ assertTrue(PATH + " should exist", check(PATH));
+ assertEquals(PATH + " should have been reset", "content", read(PATH));
+ assertFalse(path + " should not exist", check(path));
+ git.stashApply().setStashRef("stash@{0}").call();
+ assertTrue(PATH + " should exist", check(PATH));
+ assertEquals(PATH + " should have new content", "changed", read(PATH));
+ assertTrue(path + " should exist", check(path));
+ assertEquals(path + " should have new content", "untracked",
+ read(path));
+ }
}
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 b8ee1ec..fc8bb87 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/StashApplyCommand.java
@@ -232,19 +232,19 @@ public ObjectId call() throws GitAPIException,
untrackedMerger.setBase(null);
boolean ok = untrackedMerger.merge(headCommit,
untrackedCommit);
- if (ok)
+ if (ok) {
try {
RevTree untrackedTree = revWalk
- .parseTree(untrackedMerger
- .getResultTreeId());
+ .parseTree(untrackedCommit);
resetUntracked(untrackedTree);
} catch (CheckoutConflictException e) {
throw new StashApplyFailureException(
- JGitText.get().stashApplyConflict);
+ JGitText.get().stashApplyConflict, e);
}
- else
+ } else {
throw new StashApplyFailureException(
JGitText.get().stashApplyConflict);
+ }
}
} else {
throw new StashApplyFailureException(