Browse Source

Ensure a directory exists before trying to create/merge a file into it.

Since git doesn't keep track of empty directories, they should be
created first. Test case included demonstrates that using
StashApplyCommand(). Bugfix is applied to the DirCacheCheckout class,
because StashApplyCommand() uses it internally to apply a stash.

Change-Id: Iac259229ef919f9e92e7e51a671d877172bb88a8
Signed-off-by: Jevgeni Zelenkov <jevgeni.zelenkov@gmail.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
stable-2.1
Jevgeni Zelenkov 12 years ago committed by Matthias Sohn
parent
commit
803debd7be
  1. 8
      org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/JGitTestUtil.java
  2. 32
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashApplyCommandTest.java
  3. 6
      org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java
  4. 1
      org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java

8
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.
*

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

@ -421,6 +421,38 @@ public class StashApplyCommandTest extends RepositoryTestCase {
assertTrue(status.getModified().contains(PATH));
}
@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 {

6
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);
}

1
org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java vendored

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

Loading…
Cancel
Save