Browse Source

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>
stable-5.5
René Scheibe 6 years ago committed by Matthias Sohn
parent
commit
b4edf9ec14
  1. 16
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java
  2. 23
      org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/DirCacheCheckoutTest.java
  3. 3
      org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java

16
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java

@ -189,6 +189,22 @@ public class ResetCommandTest extends RepositoryTestCase {
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 {

23
org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/DirCacheCheckoutTest.java

@ -1977,6 +1977,29 @@ public class DirCacheCheckoutTest extends RepositoryTestCase {
} }
} }
@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

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

@ -1470,6 +1470,9 @@ public class DirCacheCheckout {
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…
Cancel
Save