From 70cf18d8746a1ec48fff9cf3a866df9ca294915e Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Thu, 17 Sep 2020 08:53:28 -0700 Subject: [PATCH] Implement proxyInputStream array read methods --- .../main/scala/sbt/internal/util/Terminal.scala | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala b/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala index 6a34fa098..f0c6a4651 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala @@ -435,7 +435,7 @@ object Terminal { private[this] val originalErr = System.err private[this] val originalIn = System.in private[sbt] class WriteableInputStream(in: InputStream, name: String) - extends InputStream + extends SimpleInputStream with AutoCloseable { final def write(bytes: Int*): Unit = readThread.synchronized { bytes.foreach(b => buffer.put(b)) @@ -567,7 +567,15 @@ object Terminal { bootOutputStreamHolder.set(bootOutputStream) } - private[this] object proxyInputStream extends InputStream { + private[sbt] trait SimpleInputStream extends InputStream { + override def read(b: Array[Byte]): Int = read(b, 0, b.length) + override def read(b: Array[Byte], off: Int, len: Int): Int = { + val byte = read() + b(off) = byte.toByte + 1 + } + } + private[this] object proxyInputStream extends SimpleInputStream { private[this] val isScripted = System.getProperty("sbt.scripted", "false") == "true" /* * This is to handle the case when a remote client starts sbt and the build fails. @@ -648,7 +656,7 @@ object Terminal { private[this] object proxyErrorStream extends PrintStream(proxyErrorOutputStream, true) private[this] lazy val isWindows = System.getProperty("os.name", "").toLowerCase(Locale.ENGLISH).indexOf("windows") >= 0 - private[this] object WrappedSystemIn extends InputStream { + private[this] object WrappedSystemIn extends SimpleInputStream { private[this] val in = proxyInputStream override def available(): Int = if (attached.get) in.available() else 0 override def read(): Int = synchronized {