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>
This commit is contained in:
Robin Rosenberg 2013-02-20 22:54:59 +01:00 committed by Robin Stocker
parent 13ea3b0957
commit 08d5ede281
2 changed files with 70 additions and 1 deletions

View File

@ -43,6 +43,8 @@
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.assertTrue;
import static org.junit.Assert.fail;
@ -175,6 +177,7 @@ public void testMkdirs() throws IOException {
assertTrue(f.delete());
}
@Test
public void testCreateNewFile() throws IOException {
File f = new File(trash, "x");
FileUtils.createNewFile(f);
@ -190,4 +193,47 @@ public void testCreateNewFile() throws IOException {
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());
}
}

View File

@ -83,6 +83,14 @@ public class FileUtils {
*/
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
*
@ -126,7 +134,22 @@ public static void delete(final File f, int options) throws IOException {
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()) {
for (int i = 1; i < 10; i++) {
try {