diff --git a/core/pom.xml b/core/pom.xml index 277d662ff1a37ff850965f99cb87948d9b0d5a8c..dd5ae4f8844e9cf2e654dd70e57336163635ed26 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -766,6 +766,7 @@ THE SOFTWARE. 0.5C true -XX:MaxPermSize=128m -noverify + false diff --git a/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java b/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java index 444040d5894cdc5a9f0db1122994d13fc1910f8e..b7bb2b5f022df4b4d4caabc53349f85991e2bbc1 100644 --- a/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java +++ b/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java @@ -28,6 +28,7 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import org.apache.commons.io.FileUtils; /** * {@link OutputStream} that writes to a file. @@ -48,6 +49,7 @@ public class RewindableFileOutputStream extends OutputStream { private synchronized OutputStream current() throws IOException { if (current == null) { if (!closed) { + FileUtils.forceMkdir(out.getParentFile()); try { current = new FileOutputStream(out,false); } catch (FileNotFoundException e) { diff --git a/core/src/test/java/hudson/util/io/ReopenableRotatingFileOutputStreamTest.java b/core/src/test/java/hudson/util/io/RewindableRotatingFileOutputStreamTest.java similarity index 53% rename from core/src/test/java/hudson/util/io/ReopenableRotatingFileOutputStreamTest.java rename to core/src/test/java/hudson/util/io/RewindableRotatingFileOutputStreamTest.java index 94fc5cf9ed61ef793dbc0d3705f68cccd3c04608..867ac546a689950296b532562c8f0087ea7da653 100644 --- a/core/src/test/java/hudson/util/io/ReopenableRotatingFileOutputStreamTest.java +++ b/core/src/test/java/hudson/util/io/RewindableRotatingFileOutputStreamTest.java @@ -9,16 +9,20 @@ import org.junit.Test; import java.io.File; import java.io.IOException; import java.io.PrintWriter; +import org.apache.commons.io.FileUtils; +import org.junit.Rule; +import org.junit.rules.TemporaryFolder; +import org.jvnet.hudson.test.Issue; -/** - * @author Kohsuke Kawaguchi - */ -public class ReopenableRotatingFileOutputStreamTest { +public class RewindableRotatingFileOutputStreamTest { + + @Rule + public TemporaryFolder tmp = new TemporaryFolder(); @Test public void rotation() throws IOException, InterruptedException { - File base = File.createTempFile("test", "log"); - ReopenableRotatingFileOutputStream os = new ReopenableRotatingFileOutputStream(base,3); + File base = tmp.newFile("test.log"); + RewindableRotatingFileOutputStream os = new RewindableRotatingFileOutputStream(base,3); PrintWriter w = new PrintWriter(os,true); for (int i=0; i<=4; i++) { w.println("Content"+i); @@ -35,4 +39,21 @@ public class ReopenableRotatingFileOutputStreamTest { os.deleteAll(); } + + @Issue("JENKINS-16634") + @Test + public void deletedFolder() throws Exception { + File dir = tmp.newFolder("dir"); + File base = new File(dir, "x.log"); + RewindableRotatingFileOutputStream os = new RewindableRotatingFileOutputStream(base, 3); + for (int i = 0; i < 2; i++) { + FileUtils.deleteDirectory(dir); + os.write('.'); + FileUtils.deleteDirectory(dir); + os.write('.'); + FileUtils.deleteDirectory(dir); + os.rewind(); + } + } + }