diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java index 197a27f60b..8d1233ab04 100644 --- a/core/src/main/java/hudson/FilePath.java +++ b/core/src/main/java/hudson/FilePath.java @@ -79,6 +79,7 @@ import java.net.URL; import java.net.URLConnection; import java.nio.file.Files; import java.nio.file.InvalidPathException; +import java.nio.file.LinkOption; import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.Arrays; @@ -125,8 +126,10 @@ import org.kohsuke.stapler.Stapler; import static hudson.FilePath.TarCompression.GZIP; import static hudson.Util.deleteFile; +import static hudson.Util.fileToPath; import static hudson.Util.fixEmpty; import static hudson.Util.isSymlink; + import java.util.Collections; /** @@ -1165,7 +1168,7 @@ public final class FilePath implements Serializable { // following Ant task to avoid possible race condition. Thread.sleep(10); - return f.mkdirs() || f.exists(); + return mkdirs(f) || f.exists(); } })) throw new IOException("Failed to mkdirs: "+remote); @@ -1615,7 +1618,7 @@ public final class FilePath implements Serializable { if (Util.NATIVE_CHMOD_MODE) { PosixAPI.jnr().chmod(f.getAbsolutePath(), mask); } else { - Files.setPosixFilePermissions(Util.fileToPath(f), Util.modeToPermissions(mask)); + Files.setPosixFilePermissions(fileToPath(f), Util.modeToPermissions(mask)); } } @@ -1962,7 +1965,7 @@ public final class FilePath implements Serializable { act(new SecureFileCallable() { private static final long serialVersionUID = 1L; public Void invoke(File f, VirtualChannel channel) throws IOException { - reading(f).renameTo(creating(new File(target.remote))); + Files.move(fileToPath(reading(f)), fileToPath(creating(new File(target.remote))), LinkOption.NOFOLLOW_LINKS); return null; } }); @@ -2024,8 +2027,8 @@ public final class FilePath implements Serializable { File targetFile = new File(target.remote); File targetDir = targetFile.getParentFile(); filterNonNull().mkdirs(targetDir); - Files.createDirectories(Util.fileToPath(targetDir)); - Files.copy(Util.fileToPath(reading(f)), Util.fileToPath(writing(targetFile)), StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING); + Files.createDirectories(fileToPath(targetDir)); + Files.copy(fileToPath(reading(f)), fileToPath(writing(targetFile)), StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING); return null; } }); @@ -2957,11 +2960,12 @@ public final class FilePath implements Serializable { return f; } - private boolean mkdirs(File dir) { + private boolean mkdirs(File dir) throws IOException { if (dir.exists()) return false; filterNonNull().mkdirs(dir); - return dir.mkdirs(); + Files.createDirectories(fileToPath(dir)); + return true; } private File mkdirsE(File dir) throws IOException { diff --git a/core/src/main/java/hudson/util/IOUtils.java b/core/src/main/java/hudson/util/IOUtils.java index 4168379405..5022dc021f 100644 --- a/core/src/main/java/hudson/util/IOUtils.java +++ b/core/src/main/java/hudson/util/IOUtils.java @@ -13,6 +13,8 @@ import java.util.Collection; import java.util.List; import java.util.regex.Pattern; +import static hudson.Util.fileToPath; + /** * Adds more to commons-io. * @@ -51,20 +53,11 @@ public class IOUtils { * This method returns the 'dir' parameter so that the method call flows better. */ public static File mkdirs(File dir) throws IOException { - if(dir.mkdirs() || dir.exists()) - return dir; - - // following Ant task to avoid possible race condition. try { - Thread.sleep(10); - } catch (InterruptedException e) { - // ignore + return Files.createDirectories(fileToPath(dir)).toFile(); + } catch (UnsupportedOperationException e) { + throw new IOException(e); } - - if (dir.mkdirs() || dir.exists()) - return dir; - - throw new IOException("Failed to create a directory at "+dir); } /** @@ -134,7 +127,7 @@ public class IOUtils { if (Util.NATIVE_CHMOD_MODE) { return PosixAPI.jnr().stat(f.getPath()).mode(); } else { - return Util.permissionsToMode(Files.getPosixFilePermissions(Util.fileToPath(f))); + return Util.permissionsToMode(Files.getPosixFilePermissions(fileToPath(f))); } } catch (IOException cause) { PosixException e = new PosixException("Unable to get file permissions", null);