diff --git a/core/src/main/java/hudson/Util.java b/core/src/main/java/hudson/Util.java index a7baa6cb3a..9025a6d70c 100644 --- a/core/src/main/java/hudson/Util.java +++ b/core/src/main/java/hudson/Util.java @@ -2,14 +2,15 @@ package hudson; import hudson.model.TaskListener; import hudson.model.Hudson; +import static hudson.model.Hudson.isWindows; import hudson.util.IOException2; +import hudson.Proc.LocalProc; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.taskdefs.Chmod; import org.apache.tools.ant.taskdefs.Copy; import org.kohsuke.stapler.Stapler; -import org.jvnet.localizer.Localizable; import java.io.BufferedReader; import java.io.ByteArrayInputStream; @@ -23,6 +24,7 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; +import java.io.PrintStream; import java.net.InetAddress; import java.net.UnknownHostException; import java.security.DigestInputStream; @@ -669,6 +671,31 @@ public class Util { return createFileSet(baseDir,includes,null); } + /** + * Creates a symlink to baseDir+targetPath at baseDir+symlinkPath. + *

+ * If there's a prior symlink at baseDir+symlinkPath, it will be overwritten. + */ + public static void createSymlink(File baseDir, String targetPath, String symlinkPath, TaskListener listener) throws InterruptedException { + if(!isWindows()) { + try { + // ignore a failure. + new LocalProc(new String[]{"rm","-rf", symlinkPath},new String[0],listener.getLogger(), baseDir).join(); + + int r = new LocalProc(new String[]{ + "ln","-s", targetPath, symlinkPath}, + new String[0],listener.getLogger(), baseDir).join(); + if(r!=0) + listener.getLogger().println("ln failed: "+r); + } catch (IOException e) { + PrintStream log = listener.getLogger(); + log.println("ln failed"); + Util.displayIOException(e,listener); + e.printStackTrace( log ); + } + } + } + /** * Wraps with the error icon and the CSS class to render error message. * @since 1.173 diff --git a/core/src/main/java/hudson/model/AbstractBuild.java b/core/src/main/java/hudson/model/AbstractBuild.java index 425750b8d4..91780d074f 100644 --- a/core/src/main/java/hudson/model/AbstractBuild.java +++ b/core/src/main/java/hudson/model/AbstractBuild.java @@ -235,23 +235,7 @@ public abstract class AbstractBuild

,R extends Abs } private void createLastSuccessfulLink(BuildListener listener) throws InterruptedException { - if(!isWindows()) { - try { - // ignore a failure. - new LocalProc(new String[]{"rm","-rf","../lastSuccessful"},new String[0],listener.getLogger(),getProject().getBuildDir()).join(); - - int r = new LocalProc(new String[]{ - "ln","-s","builds/"+getId()/*ugly*/,"../lastSuccessful"}, - new String[0],listener.getLogger(),getProject().getBuildDir()).join(); - if(r!=0) - listener.getLogger().println("ln failed: "+r); - } catch (IOException e) { - PrintStream log = listener.getLogger(); - log.println("ln failed"); - Util.displayIOException(e,listener); - e.printStackTrace( log ); - } - } + Util.createSymlink(getProject().getBuildDir(),"builds/"+getId(),"../lastSuccessful",listener); } private boolean checkout(BuildListener listener) throws Exception {