diff --git a/platform/platform-resources-en/src/messages/CommonBundle.properties b/platform/platform-resources-en/src/messages/CommonBundle.properties index c9101a385572..8ec9ff431b0a 100644 --- a/platform/platform-resources-en/src/messages/CommonBundle.properties +++ b/platform/platform-resources-en/src/messages/CommonBundle.properties @@ -32,6 +32,7 @@ button.reset.to.default=&Reset to Default button.delete=Delete button.copy=Copy... button.close=&Close +exception.directory.can.not.create=Cannot create directory {0} exception.directory.is.not.readable=Directory is not readable {0} exception.directory.is.invalid=Directory is invalid {0} button.add=Add diff --git a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java index a4559d427503..0ea241be4ef3 100644 --- a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java +++ b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java @@ -629,6 +629,7 @@ public class FileUtil { performCopy(fromFile, toFile, false); } + @SuppressWarnings("IOResourceOpenedButNotSafelyClosed") private static void performCopy(@NotNull File fromFile, @NotNull File toFile, final boolean syncTimestamp) throws IOException { FileOutputStream fos; try { @@ -668,7 +669,17 @@ public class FileUtil { } if (syncTimestamp) { - toFile.setLastModified(fromFile.lastModified()); + final long timeStamp = fromFile.lastModified(); + if (!toFile.setLastModified(timeStamp)) { + LOG.warn("Unable to set timestamp " + timeStamp + " to " + toFile); + } + } + + if (SystemInfo.isUnix && fromFile.canExecute()) { + final int permissions = FileSystemUtil.getPermissions(fromFile); + if (permissions != -1) { + FileSystemUtil.setPermissions(toFile, permissions); + } } } @@ -705,7 +716,9 @@ public class FileUtil { } public static void copyDir(@NotNull File fromDir, @NotNull File toDir, @Nullable final FileFilter filter) throws IOException { - toDir.mkdirs(); + if (!toDir.exists() || !toDir.mkdirs()) { + throw new IOException(CommonBundle.message("exception.directory.can.not.create", fromDir.getPath())); + } if (isAncestor(fromDir, toDir, true)) { LOG.error(fromDir.getAbsolutePath() + " is ancestor of " + toDir + ". Can't copy to itself."); return;