mirror of https://github.com/sbt/sbt.git
Merge pull request #6003 from eatkins/simple-input-stream
Fix SimpleInputStream reads into array
This commit is contained in:
commit
6871d66c3f
|
|
@ -16,7 +16,7 @@ import org.jline.utils.{ ClosedException, NonBlockingReader }
|
|||
import org.jline.terminal.{ Attributes, Size, Terminal => JTerminal }
|
||||
import org.jline.terminal.Attributes.{ InputFlag, LocalFlag }
|
||||
import org.jline.terminal.Terminal.SignalHandler
|
||||
import org.jline.terminal.impl.AbstractTerminal
|
||||
import org.jline.terminal.impl.{ AbstractTerminal, DumbTerminal }
|
||||
import org.jline.terminal.impl.jansi.JansiSupportImpl
|
||||
import org.jline.terminal.impl.jansi.win.JansiWinSysTerminal
|
||||
import org.jline.utils.OSUtils
|
||||
|
|
@ -73,6 +73,11 @@ private[sbt] object JLine3 {
|
|||
term
|
||||
}
|
||||
private[sbt] def apply(term: Terminal): JTerminal = {
|
||||
if (System.getProperty("jline.terminal", "") == "none")
|
||||
new DumbTerminal(term.inputStream, term.outputStream)
|
||||
else wrapTerminal(term)
|
||||
}
|
||||
private[this] def wrapTerminal(term: Terminal): JTerminal = {
|
||||
new AbstractTerminal(
|
||||
term.name,
|
||||
"nocapabilities",
|
||||
|
|
|
|||
|
|
@ -486,7 +486,7 @@ object Terminal {
|
|||
val _ = readQueue.take
|
||||
val b = in.read
|
||||
buffer.put(b)
|
||||
if (Thread.interrupted() || (b != -1 && !isRaw.get)) closed.set(true)
|
||||
if (Thread.interrupted() || (b == -1 && isRaw.get)) closed.set(true)
|
||||
else impl()
|
||||
}
|
||||
try impl()
|
||||
|
|
@ -596,9 +596,12 @@ object Terminal {
|
|||
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
|
||||
read() match {
|
||||
case -1 => -1
|
||||
case byte =>
|
||||
b(off) = byte.toByte
|
||||
1
|
||||
}
|
||||
}
|
||||
}
|
||||
private[this] object proxyInputStream extends SimpleInputStream {
|
||||
|
|
|
|||
|
|
@ -934,12 +934,9 @@ class NetworkClient(
|
|||
val stopped = new AtomicBoolean(false)
|
||||
override final def run(): Unit = {
|
||||
def read(): Unit = {
|
||||
inputStream.read match {
|
||||
case -1 =>
|
||||
case b =>
|
||||
inLock.synchronized(stdinBytes.offer(b))
|
||||
if (attached.get()) drain()
|
||||
}
|
||||
val b = inputStream.read
|
||||
inLock.synchronized(stdinBytes.offer(b))
|
||||
if (attached.get()) drain()
|
||||
}
|
||||
try read()
|
||||
catch { case _: InterruptedException | NonFatal(_) => stopped.set(true) } finally {
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@ package server
|
|||
|
||||
import java.io.{ IOException, InputStream, OutputStream }
|
||||
import java.net.{ Socket, SocketTimeoutException }
|
||||
import java.nio.channels.ClosedChannelException
|
||||
import java.util.concurrent.{
|
||||
ConcurrentHashMap,
|
||||
Executors,
|
||||
|
|
@ -85,7 +84,7 @@ final class NetworkChannel(
|
|||
private var initialized = false
|
||||
private val pendingRequests: mutable.Map[String, JsonRpcRequestMessage] = mutable.Map()
|
||||
|
||||
private[this] val inputBuffer = new LinkedBlockingQueue[Byte]()
|
||||
private[this] val inputBuffer = new LinkedBlockingQueue[Int]()
|
||||
private[this] val pendingWrites = new LinkedBlockingQueue[(Array[Byte], Boolean)]()
|
||||
private[this] val attached = new AtomicBoolean(false)
|
||||
private[this] val alive = new AtomicBoolean(true)
|
||||
|
|
@ -107,7 +106,7 @@ final class NetworkChannel(
|
|||
interactive.set(true)
|
||||
jsonRpcNotify(promptChannel, "")
|
||||
}
|
||||
private[sbt] def write(byte: Byte) = inputBuffer.add(byte)
|
||||
private[sbt] def write(byte: Byte) = inputBuffer.add(byte.toInt)
|
||||
|
||||
private[this] val terminalHolder = new AtomicReference[Terminal](Terminal.NullTerminal)
|
||||
override private[sbt] def terminal: Terminal = terminalHolder.get
|
||||
|
|
@ -634,15 +633,12 @@ final class NetworkChannel(
|
|||
)
|
||||
}
|
||||
|
||||
private[this] lazy val inputStream: InputStream = new InputStream {
|
||||
private[this] lazy val inputStream: InputStream = new Terminal.SimpleInputStream {
|
||||
override def read(): Int = {
|
||||
import sjsonnew.BasicJsonProtocol._
|
||||
try {
|
||||
jsonRpcNotify(readSystemIn, "")
|
||||
inputBuffer.take & 0xFF match {
|
||||
case -1 => throw new ClosedChannelException()
|
||||
case b => b
|
||||
}
|
||||
inputBuffer.take
|
||||
} catch {
|
||||
case e: IOException =>
|
||||
try jsonRpcNotify(cancelReadSystemIn, "")
|
||||
|
|
|
|||
Loading…
Reference in New Issue