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:
parent
e5f86d4630
commit
b4edf9ec14
|
@ -189,6 +189,22 @@ public void testHardResetWithConflicts_DeleteFileFolderConflict() throws Excepti
|
||||||
assertFalse(new File(db.getWorkTree(), "dir-or-file").exists());
|
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
|
@Test
|
||||||
public void testResetToNonexistingHEAD() throws JGitInternalException,
|
public void testResetToNonexistingHEAD() throws JGitInternalException,
|
||||||
AmbiguousObjectException, IOException, GitAPIException {
|
AmbiguousObjectException, IOException, GitAPIException {
|
||||||
|
|
|
@ -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 {
|
private static class TestFileTreeIterator extends FileTreeIterator {
|
||||||
|
|
||||||
// For assertions only
|
// For assertions only
|
||||||
|
|
|
@ -1470,6 +1470,9 @@ public static void checkoutEntry(Repository repo, DirCacheEntry entry,
|
||||||
ObjectLoader ol = or.open(entry.getObjectId());
|
ObjectLoader ol = or.open(entry.getObjectId());
|
||||||
File f = new File(repo.getWorkTree(), entry.getPathString());
|
File f = new File(repo.getWorkTree(), entry.getPathString());
|
||||||
File parentDir = f.getParentFile();
|
File parentDir = f.getParentFile();
|
||||||
|
if (parentDir.isFile()) {
|
||||||
|
FileUtils.delete(parentDir);
|
||||||
|
}
|
||||||
FileUtils.mkdirs(parentDir, true);
|
FileUtils.mkdirs(parentDir, true);
|
||||||
FS fs = repo.getFS();
|
FS fs = repo.getFS();
|
||||||
WorkingTreeOptions opt = repo.getConfig().get(WorkingTreeOptions.KEY);
|
WorkingTreeOptions opt = repo.getConfig().get(WorkingTreeOptions.KEY);
|
||||||
|
|
Loading…
Reference in New Issue