Browse Source

Extend FileUtils.delete with option to delete empty directories only

The new option EMPTY_DIRECTORIES_ONLY will make delete() only delete
empty directories. Any attempt to delete files will fail. Can be
combined with RECURSIVE to wipe out entire tree structures and
IGNORE_ERRORS to silently ignore any files or non-empty directories.

Change-Id: Icaa9a30e5302ee5c0ba23daad11c7b93e26b7445
Signed-off-by: Robin Stocker <robin@nibor.org>
stable-3.0
Robin Rosenberg 12 years ago committed by Robin Stocker
parent
commit
08d5ede281
  1. 46
      org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FileUtilTest.java
  2. 25
      org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java

46
org.eclipse.jgit.test/tst/org/eclipse/jgit/util/FileUtilTest.java

@ -43,6 +43,8 @@
package org.eclipse.jgit.util; package org.eclipse.jgit.util;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.endsWith;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
@ -175,6 +177,7 @@ public class FileUtilTest {
assertTrue(f.delete()); assertTrue(f.delete());
} }
@Test
public void testCreateNewFile() throws IOException { public void testCreateNewFile() throws IOException {
File f = new File(trash, "x"); File f = new File(trash, "x");
FileUtils.createNewFile(f); FileUtils.createNewFile(f);
@ -190,4 +193,47 @@ public class FileUtilTest {
FileUtils.delete(f); FileUtils.delete(f);
} }
@Test
public void testDeleteEmptyTreeOk() throws IOException {
File t = new File(trash, "t");
FileUtils.mkdir(t);
FileUtils.mkdir(new File(t, "d"));
FileUtils.mkdir(new File(new File(t, "d"), "e"));
FileUtils.delete(t, FileUtils.EMPTY_DIRECTORIES_ONLY | FileUtils.RECURSIVE);
assertFalse(t.exists());
}
@Test
public void testDeleteNotEmptyTreeNotOk() throws IOException {
File t = new File(trash, "t");
FileUtils.mkdir(t);
FileUtils.mkdir(new File(t, "d"));
File f = new File(new File(t, "d"), "f");
FileUtils.createNewFile(f);
FileUtils.mkdir(new File(new File(t, "d"), "e"));
try {
FileUtils.delete(t, FileUtils.EMPTY_DIRECTORIES_ONLY | FileUtils.RECURSIVE);
fail("expected failure to delete f");
} catch (IOException e) {
assertThat(e.getMessage(), endsWith(f.getAbsolutePath()));
}
assertTrue(t.exists());
}
@Test
public void testDeleteNotEmptyTreeNotOkButIgnoreFail() throws IOException {
File t = new File(trash, "t");
FileUtils.mkdir(t);
FileUtils.mkdir(new File(t, "d"));
File f = new File(new File(t, "d"), "f");
FileUtils.createNewFile(f);
File e = new File(new File(t, "d"), "e");
FileUtils.mkdir(e);
FileUtils.delete(t, FileUtils.EMPTY_DIRECTORIES_ONLY | FileUtils.RECURSIVE
| FileUtils.IGNORE_ERRORS);
// Should have deleted as much as possible, but not all
assertTrue(t.exists());
assertTrue(f.exists());
assertFalse(e.exists());
}
} }

25
org.eclipse.jgit/src/org/eclipse/jgit/util/FileUtils.java

@ -83,6 +83,14 @@ public class FileUtils {
*/ */
public static final int IGNORE_ERRORS = 8; public static final int IGNORE_ERRORS = 8;
/**
* Option to only delete empty directories. This option can be combined with
* {@link #RECURSIVE}
*
* @since 2.4
*/
public static final int EMPTY_DIRECTORIES_ONLY = 16;
/** /**
* Delete file or empty folder * Delete file or empty folder
* *
@ -126,7 +134,22 @@ public class FileUtils {
delete(c, options); delete(c, options);
} }
} }
if (!f.delete()) {
boolean delete = false;
if ((options & EMPTY_DIRECTORIES_ONLY) != 0) {
if (f.isDirectory()) {
delete = true;
} else {
if ((options & IGNORE_ERRORS) == 0)
throw new IOException(MessageFormat.format(
JGitText.get().deleteFileFailed,
f.getAbsolutePath()));
}
} else {
delete = true;
}
if (delete && !f.delete()) {
if ((options & RETRY) != 0 && f.exists()) { if ((options & RETRY) != 0 && f.exists()) {
for (int i = 1; i < 10; i++) { for (int i = 1; i < 10; i++) {
try { try {

Loading…
Cancel
Save