git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@703151 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -404,6 +404,12 @@ Other changes: | |||
| * <ftp> now supports selectors for remote directories as well. | |||
| Bugzilla Report 44726. | |||
| * In some cases Ant fails to rename files if the source or target | |||
| file has just recently been closed on Windows. It will now try to | |||
| delete the offending file once again after giving the Java VM time | |||
| to really close the file. | |||
| Bugzilla Report 45960. | |||
| Changes from Ant 1.7.0 TO Ant 1.7.1 | |||
| ============================================= | |||
| @@ -57,6 +57,7 @@ import org.apache.tools.ant.types.selectors.FilenameSelector; | |||
| import org.apache.tools.ant.types.selectors.MajoritySelector; | |||
| import org.apache.tools.ant.types.selectors.ContainsRegexpSelector; | |||
| import org.apache.tools.ant.types.selectors.modifiedselector.ModifiedSelector; | |||
| import org.apache.tools.ant.util.FileUtils; | |||
| import org.apache.tools.ant.util.SymbolicLinkUtils; | |||
| /** | |||
| @@ -74,7 +75,6 @@ import org.apache.tools.ant.util.SymbolicLinkUtils; | |||
| * @ant.task category="filesystem" | |||
| */ | |||
| public class Delete extends MatchingTask { | |||
| private static final int DELETE_RETRY_SLEEP_MILLIS = 10; | |||
| private static final ResourceComparator REVERSE_FILESYSTEM = new Reverse(new FileSystem()); | |||
| private static final ResourceSelector EXISTS = new Exists(); | |||
| @@ -114,6 +114,7 @@ public class Delete extends MatchingTask { | |||
| private boolean failonerror = true; | |||
| private boolean deleteOnExit = false; | |||
| private Resources rcs = null; | |||
| private static FileUtils FILE_UTILS = FileUtils.getFileUtils(); | |||
| private static SymbolicLinkUtils SYMLINK_UTILS = | |||
| SymbolicLinkUtils.getSymbolicLinkUtils(); | |||
| @@ -659,16 +660,7 @@ public class Delete extends MatchingTask { | |||
| * wait a little and try again. | |||
| */ | |||
| private boolean delete(File f) { | |||
| if (!f.delete()) { | |||
| if (Os.isFamily("windows")) { | |||
| System.gc(); | |||
| } | |||
| try { | |||
| Thread.sleep(DELETE_RETRY_SLEEP_MILLIS); | |||
| } catch (InterruptedException ex) { | |||
| // Ignore Exception | |||
| } | |||
| if (!f.delete()) { | |||
| if (!FILE_UTILS.tryHardToDelete(f)) { | |||
| if (deleteOnExit) { | |||
| int level = quiet ? Project.MSG_VERBOSE : Project.MSG_INFO; | |||
| log("Failed to delete " + f + ", calling deleteOnExit." | |||
| @@ -678,7 +670,6 @@ public class Delete extends MatchingTask { | |||
| return true; | |||
| } | |||
| return false; | |||
| } | |||
| } | |||
| return true; | |||
| } | |||
| @@ -54,6 +54,7 @@ import org.apache.tools.ant.types.resources.FileResource; | |||
| * | |||
| */ | |||
| public class FileUtils { | |||
| private static final int DELETE_RETRY_SLEEP_MILLIS = 10; | |||
| private static final int EXPAND_SPACE = 50; | |||
| private static final FileUtils PRIMARY_INSTANCE = new FileUtils(); | |||
| @@ -1229,7 +1230,7 @@ public class FileUtils { | |||
| System.err.println("Rename of " + from + " to " + to + " is a no-op."); | |||
| return; | |||
| } | |||
| if (to.exists() && !(from.equals(to.getCanonicalFile()) || to.delete())) { | |||
| if (to.exists() && !(from.equals(to.getCanonicalFile()) || tryHardToDelete(to))) { | |||
| throw new IOException("Failed to delete " + to + " while trying to rename " + from); | |||
| } | |||
| File parent = to.getParentFile(); | |||
| @@ -1239,7 +1240,7 @@ public class FileUtils { | |||
| } | |||
| if (!from.renameTo(to)) { | |||
| copyFile(from, to); | |||
| if (!from.delete()) { | |||
| if (!tryHardToDelete(from)) { | |||
| throw new IOException("Failed to delete " + from + " while trying to rename it."); | |||
| } | |||
| } | |||
| @@ -1437,6 +1438,30 @@ public class FileUtils { | |||
| } | |||
| } | |||
| /** | |||
| * Accommodate Windows bug encountered in both Sun and IBM JDKs. | |||
| * Others possible. If the delete does not work, call System.gc(), | |||
| * wait a little and try again. | |||
| * | |||
| * @return whether deletion was successful | |||
| * @since Ant 1.8.0 | |||
| */ | |||
| public boolean tryHardToDelete(File f) { | |||
| if (!f.delete()) { | |||
| if (ON_WINDOWS) { | |||
| System.gc(); | |||
| } | |||
| try { | |||
| Thread.sleep(DELETE_RETRY_SLEEP_MILLIS); | |||
| } catch (InterruptedException ex) { | |||
| // Ignore Exception | |||
| } | |||
| return f.delete(); | |||
| } | |||
| return true; | |||
| } | |||
| /** | |||
| * Calculates the relative path between two files. | |||
| * <p> | |||