diff options
4 files changed, 47 insertions, 0 deletions
diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/JGitTestUtil.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/JGitTestUtil.java index d3da09ffbd..b3376a54be 100644 --- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/JGitTestUtil.java +++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/JGitTestUtil.java @@ -141,6 +141,14 @@ public abstract class JGitTestUtil { return path; } + public static File writeTrashFile(final FileRepository db, + final String subdir, + final String name, final String data) throws IOException { + File path = new File(db.getWorkTree() + "/" + subdir, name); + write(path, data); + return path; + } + /** * Write a string as a UTF-8 file. * 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 bc11b7a703..117ef88dc9 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 @@ -422,6 +422,38 @@ public class StashApplyCommandTest extends RepositoryTestCase { } @Test + public void stashChangeInANewSubdirectory() throws Exception { + String subdir = "subdir"; + String fname = "file2.txt"; + String path = subdir + System.getProperty("file.separator") + fname; + String otherBranch = "otherbranch"; + + writeTrashFile(subdir, fname, "content2"); + + git.add().addFilepattern(path).call(); + RevCommit stashed = git.stashCreate().call(); + assertNotNull(stashed); + assertTrue(git.status().call().isClean()); + + git.branchCreate().setName(otherBranch).call(); + git.checkout().setName(otherBranch).call(); + + ObjectId unstashed = git.stashApply().call(); + assertEquals(stashed, unstashed); + + Status status = git.status().call(); + assertTrue(status.getChanged().isEmpty()); + assertTrue(status.getConflicting().isEmpty()); + assertTrue(status.getMissing().isEmpty()); + assertTrue(status.getRemoved().isEmpty()); + assertTrue(status.getModified().isEmpty()); + assertTrue(status.getUntracked().isEmpty()); + + assertEquals(1, status.getAdded().size()); + assertTrue(status.getAdded().contains(path)); + } + + @Test public void unstashNonStashCommit() throws Exception { try { git.stashApply().setStashRef(head.name()).call(); diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java index c06322e8e4..457fd1a7ef 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java @@ -102,6 +102,12 @@ public abstract class RepositoryTestCase extends LocalDiskRepositoryTestCase { return JGitTestUtil.writeTrashFile(db, name, data); } + protected File writeTrashFile(final String subdir, final String name, + final String data) + throws IOException { + return JGitTestUtil.writeTrashFile(db, subdir, name, data); + } + protected void deleteTrashFile(final String name) throws IOException { JGitTestUtil.deleteTrashFile(db, name); } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java index f46869e421..6e417b33b3 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java @@ -962,6 +962,7 @@ public class DirCacheCheckout { DirCacheEntry entry, ObjectReader or) throws IOException { ObjectLoader ol = or.open(entry.getObjectId()); File parentDir = f.getParentFile(); + parentDir.mkdirs(); File tmpFile = File.createTempFile("._" + f.getName(), null, parentDir); WorkingTreeOptions opt = repo.getConfig().get(WorkingTreeOptions.KEY); FileOutputStream rawChannel = new FileOutputStream(tmpFile); |