Fix "reset -hard" bug that folders could not be created

Creating a folder failed in case a file with the same name already
existed.

Bug: 479266
Change-Id: Ia987660ec0968ad4081dbd5a60e80660539497e3
Signed-off-by: René Scheibe <rene.scheibe@gmail.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
This commit is contained in:
René Scheibe 2018-08-04 19:26:11 +02:00 committed by Matthias Sohn
parent e5f86d4630
commit b4edf9ec14
3 changed files with 42 additions and 0 deletions

View File

@ -189,6 +189,22 @@ public void testHardResetWithConflicts_DeleteFileFolderConflict() throws Excepti
assertFalse(new File(db.getWorkTree(), "dir-or-file").exists());
}
@Test
public void testHardResetWithConflicts_CreateFolder_UnstagedChanges() throws Exception {
setupRepository();
writeTrashFile("dir-or-file/c.txt", "content");
git.add().addFilepattern("dir-or-file/c.txt").call();
git.commit().setMessage("adding dir-or-file/c.txt").call();
FileUtils.delete(new File(db.getWorkTree(), "dir-or-file"), FileUtils.RECURSIVE);
writeTrashFile("dir-or-file", "content");
// bug 479266: cannot create folder "dir-or-file"
git.reset().setMode(ResetType.HARD).setRef(Constants.HEAD).call();
assertTrue(new File(db.getWorkTree(), "dir-or-file/c.txt").exists());
}
@Test
public void testResetToNonexistingHEAD() throws JGitInternalException,
AmbiguousObjectException, IOException, GitAPIException {

View File

@ -1977,6 +1977,29 @@ public void testResetWithChangeInGitignore() throws Exception {
}
}
@Test
public void testCheckoutWithEmptyIndexDoesntOverwrite() throws Exception {
try (Git git = new Git(db);
TestRepository<Repository> db_t = new TestRepository<>(db)) {
// prepare the commits
BranchBuilder master = db_t.branch("master");
RevCommit mergeCommit = master.commit()
.add("p/x", "headContent")
.message("m0").create();
master.commit().add("p/x", "headContent").message("m1").create();
git.checkout().setName("master").call();
// empty index and write unsaved data in 'p'
git.rm().addFilepattern("p").call();
writeTrashFile("p", "important data");
git.checkout().setName(mergeCommit.getName()).call();
assertEquals("", indexState(CONTENT));
assertEquals("important data", read("p"));
}
}
private static class TestFileTreeIterator extends FileTreeIterator {
// For assertions only

View File

@ -1470,6 +1470,9 @@ public static void checkoutEntry(Repository repo, DirCacheEntry entry,
ObjectLoader ol = or.open(entry.getObjectId());
File f = new File(repo.getWorkTree(), entry.getPathString());
File parentDir = f.getParentFile();
if (parentDir.isFile()) {
FileUtils.delete(parentDir);
}
FileUtils.mkdirs(parentDir, true);
FS fs = repo.getFS();
WorkingTreeOptions opt = repo.getConfig().get(WorkingTreeOptions.KEY);