@@ -1219,16 +1279,21 @@ public class Util {
*/
public static void createSymlink(@NonNull File baseDir, @NonNull String targetPath,
@NonNull String symlinkPath, @NonNull TaskListener listener) throws InterruptedException {
+ File fileForSymlink = new File(baseDir, symlinkPath);
try {
- Path path = fileToPath(new File(baseDir, symlinkPath));
+ Path pathForSymlink = fileToPath(fileForSymlink);
Path target = Paths.get(targetPath, MemoryReductionUtil.EMPTY_STRING_ARRAY);
+ if (createSymlinkAtomic(pathForSymlink, fileForSymlink, target, symlinkPath)) {
+ return;
+ }
+
final int maxNumberOfTries = 4;
final int timeInMillis = 100;
for (int tryNumber = 1; tryNumber <= maxNumberOfTries; tryNumber++) {
- Files.deleteIfExists(path);
+ Files.deleteIfExists(pathForSymlink);
try {
- Files.createSymbolicLink(path, target);
+ Files.createSymbolicLink(pathForSymlink, target);
break;
} catch (FileAlreadyExistsException fileAlreadyExistsException) {
if (tryNumber < maxNumberOfTries) {
@@ -1249,7 +1314,7 @@ public class Util {
return;
}
PrintStream log = listener.getLogger();
- log.printf("ln %s %s failed%n",targetPath, new File(baseDir, symlinkPath));
+ log.printf("ln %s %s failed%n", targetPath, fileForSymlink);
Functions.printStackTrace(e, log);
}
}
diff --git a/core/src/main/java/hudson/cli/CLIAction.java b/core/src/main/java/hudson/cli/CLIAction.java
index 102dbbc00b0de81ef424d6bd4e50cde403bac338..efca422c443764121595943c1c2e89926cd6242a 100644
--- a/core/src/main/java/hudson/cli/CLIAction.java
+++ b/core/src/main/java/hudson/cli/CLIAction.java
@@ -190,7 +190,7 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy {
}
}
- class ServerSideImpl extends PlainCLIProtocol.ServerSide {
+ static class ServerSideImpl extends PlainCLIProtocol.ServerSide {
private Thread runningThread;
private boolean ready;
private final List