diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/JLine3.scala b/internal/util-logging/src/main/scala/sbt/internal/util/JLine3.scala index 6c2a04311..bea9b3c99 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/JLine3.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/JLine3.scala @@ -19,8 +19,8 @@ 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, DumbTerminal } -import org.jline.terminal.impl.jansi.JansiSupportImpl -import org.jline.terminal.impl.jansi.win.JansiWinSysTerminal +import org.jline.terminal.impl.jansi.JansiTerminalProvider +import org.jline.terminal.spi.{ SystemStream, TerminalProvider } import org.jline.utils.OSUtils import scala.collection.JavaConverters._ import scala.util.Try @@ -32,25 +32,22 @@ private[sbt] object JLine3 { private[this] val forceWindowsJansiHolder = new AtomicBoolean(false) private[sbt] def forceWindowsJansi(): Unit = forceWindowsJansiHolder.set(true) private[this] def windowsJansi(): org.jline.terminal.Terminal = { - val support = new JansiSupportImpl - val winConsole = support.isWindowsConsole(); + val provider = new JansiTerminalProvider val termType = sys.props.get("org.jline.terminal.type").orElse(sys.env.get("TERM")).orNull - val term = JansiWinSysTerminal.createTerminal( + provider.winSysTerminal( "console", termType, OSUtils.IS_CONEMU, Charset.forName("UTF-8"), - -1, false, SignalHandler.SIG_DFL, - true + true, + SystemStream.Output ) - term.disableScrolling() - term } private val jansi = { val (major, minor) = - (JansiSupportImpl.getJansiMajorVersion, JansiSupportImpl.getJansiMinorVersion) + (JansiTerminalProvider.getJansiMajorVersion, JansiTerminalProvider.getJansiMinorVersion) (major > 1 || minor >= 18) && Util.isWindows } private[util] def system: org.jline.terminal.Terminal = { @@ -119,6 +116,11 @@ private[sbt] object JLine3 { } } } + + // returns 'null' if the terminal was created with no provider + override def getProvider(): TerminalProvider = null + // returns 'null' if the terminal is not bound to a system stream. + override def getSystemStream(): SystemStream = null override val input: InputStream = new InputStream { override def read: Int = { val res = term.inputStream match { @@ -180,7 +182,7 @@ private[sbt] object JLine3 { case null => -1 case i => i.toInt } - override def readBuffered(buf: Array[Char]): Int = { + override def readBuffered(buf: Array[Char], off: Int, len: Int, timeout: Long): Int = { if (buffer.isEmpty) fillBuffer() buffer.take match { case i if i == -1 => -1 diff --git a/project/Dependencies.scala b/project/Dependencies.scala index f50b55152..531678e93 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -86,14 +86,14 @@ object Dependencies { // JLine 3 version must be coordinated together with JAnsi version // and the JLine 2 fork version, which uses the same JAnsi - val jline = "org.scala-sbt.jline" % "jline" % "2.14.7-sbt-a1b0ffbb8f64bb820f4f84a0c07a0c0964507493" - val jline3Version = "3.19.0" + val jline = "org.scala-sbt.jline" % "jline" % "2.14.7-sbt-9c3b6aca11c57e339441442bbf58e550cdfecb79" + val jline3Version = "3.24.1" val jline3Terminal = "org.jline" % "jline-terminal" % jline3Version val jline3Jansi = "org.jline" % "jline-terminal-jansi" % jline3Version val jline3JNA = "org.jline" % "jline-terminal-jna" % jline3Version val jline3Reader = "org.jline" % "jline-reader" % jline3Version val jline3Builtins = "org.jline" % "jline-builtins" % jline3Version - val jansi = "org.fusesource.jansi" % "jansi" % "2.1.0" + val jansi = "org.fusesource.jansi" % "jansi" % "2.4.0" val scalatest = "org.scalatest" %% "scalatest" % "3.2.10" val scalacheck = "org.scalacheck" %% "scalacheck" % "1.15.4" val junit = "junit" % "junit" % "4.13.1"