From 29dd76da8595b810cec7e509c1f34d8bd7212a76 Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Tue, 21 Aug 2012 12:26:11 -0400 Subject: [PATCH] defer opening logging output files until an actual write --- tasks/standard/Streams.scala | 2 +- util/io/DeferredWriter.scala | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 util/io/DeferredWriter.scala diff --git a/tasks/standard/Streams.scala b/tasks/standard/Streams.scala index f39cee152..a8e6c9afd 100644 --- a/tasks/standard/Streams.scala +++ b/tasks/standard/Streams.scala @@ -77,7 +77,7 @@ object Streams make(a, sid)(f => new BufferedInputStream(new FileInputStream(f))) def text(sid: String = default): PrintWriter = - make(a, sid)(f => new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), IO.defaultCharset))) ) + make(a, sid)(f => new PrintWriter(new DeferredWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), IO.defaultCharset)))) ) def binary(sid: String = default): BufferedOutputStream = make(a, sid)(f => new BufferedOutputStream(new FileOutputStream(f))) diff --git a/util/io/DeferredWriter.scala b/util/io/DeferredWriter.scala new file mode 100644 index 000000000..3e93564a2 --- /dev/null +++ b/util/io/DeferredWriter.scala @@ -0,0 +1,29 @@ +package sbt + + import java.io.Writer + +final class DeferredWriter(make: => Writer) extends Writer +{ + private[this] var opened = false + private[this] var delegate0: Writer = _ + private[this] def delegate: Writer = synchronized { + if(delegate0 eq null) { + delegate0 = make + opened = true + } + delegate0 + } + override def close() = synchronized { + if(opened) delegate0.close() + } + + override def append(c: Char): Writer = delegate.append(c) + override def append(csq: CharSequence): Writer = delegate.append(csq) + override def append(csq: CharSequence, start: Int, end: Int): Writer = delegate.append(csq, start, end) + override def flush() = delegate.flush() + override def write(cbuf: Array[Char]) = delegate.write(cbuf) + override def write(cbuf: Array[Char], off: Int, len: Int): Unit = delegate.write(cbuf, off, len) + override def write(c: Int): Unit = delegate.write(c) + override def write(s: String): Unit = delegate.write(s) + override def write(s: String, off: Int, len: Int): Unit = delegate.write(s, off, len) +} \ No newline at end of file