mirror of https://github.com/sbt/sbt.git
handle absence of CONT signal
This commit is contained in:
parent
4527e9bfc6
commit
1687cf8a8c
|
|
@ -2,7 +2,9 @@ package sbt
|
||||||
|
|
||||||
object Signals
|
object Signals
|
||||||
{
|
{
|
||||||
def withHandler[T](handler: () => Unit, signal: String = "INT")(action: () => T): T =
|
val CONT = "CONT"
|
||||||
|
val INT = "INT"
|
||||||
|
def withHandler[T](handler: () => Unit, signal: String = INT)(action: () => T): T =
|
||||||
{
|
{
|
||||||
val result =
|
val result =
|
||||||
try
|
try
|
||||||
|
|
@ -17,6 +19,13 @@ object Signals
|
||||||
case Right(v) => v
|
case Right(v) => v
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
def supported(signal: String): Boolean =
|
||||||
|
try
|
||||||
|
{
|
||||||
|
val signals = new Signals0
|
||||||
|
signals.supported(signal)
|
||||||
|
}
|
||||||
|
catch { case e: LinkageError => false }
|
||||||
}
|
}
|
||||||
|
|
||||||
// Must only be referenced using a
|
// Must only be referenced using a
|
||||||
|
|
@ -24,6 +33,13 @@ object Signals
|
||||||
// block to
|
// block to
|
||||||
private final class Signals0
|
private final class Signals0
|
||||||
{
|
{
|
||||||
|
def supported(signal: String): Boolean =
|
||||||
|
{
|
||||||
|
import sun.misc.Signal
|
||||||
|
try { new Signal(signal); true }
|
||||||
|
catch { case e: IllegalArgumentException => false }
|
||||||
|
}
|
||||||
|
|
||||||
// returns a LinkageError in `action` as Left(t) in order to avoid it being
|
// returns a LinkageError in `action` as Left(t) in order to avoid it being
|
||||||
// incorrectly swallowed as missing Signal/SignalHandler
|
// incorrectly swallowed as missing Signal/SignalHandler
|
||||||
def withHandler[T](signal: String, handler: () => Unit, action: () => T): Either[Throwable, T] =
|
def withHandler[T](signal: String, handler: () => Unit, action: () => T): Either[Throwable, T] =
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ abstract class JLine extends LineReader
|
||||||
|
|
||||||
private[this] def readLineDirect(prompt: String, mask: Option[Char]): String =
|
private[this] def readLineDirect(prompt: String, mask: Option[Char]): String =
|
||||||
if(handleCONT)
|
if(handleCONT)
|
||||||
Signals.withHandler(() => resume(), signal = "CONT")( () => readLineDirectRaw(prompt, mask) )
|
Signals.withHandler(() => resume(), signal = Signals.CONT)( () => readLineDirectRaw(prompt, mask) )
|
||||||
else
|
else
|
||||||
readLineDirectRaw(prompt, mask)
|
readLineDirectRaw(prompt, mask)
|
||||||
private[this] def readLineDirectRaw(prompt: String, mask: Option[Char]): String =
|
private[this] def readLineDirectRaw(prompt: String, mask: Option[Char]): String =
|
||||||
|
|
@ -90,7 +90,7 @@ private object JLine
|
||||||
|
|
||||||
def simple(historyPath: Option[File], handleCONT: Boolean = HandleCONT): SimpleReader = new SimpleReader(historyPath, handleCONT)
|
def simple(historyPath: Option[File], handleCONT: Boolean = HandleCONT): SimpleReader = new SimpleReader(historyPath, handleCONT)
|
||||||
val MaxHistorySize = 500
|
val MaxHistorySize = 500
|
||||||
val HandleCONT = !java.lang.Boolean.getBoolean("sbt.disable.cont")
|
val HandleCONT = !java.lang.Boolean.getBoolean("sbt.disable.cont") && Signals.supported(Signals.CONT)
|
||||||
}
|
}
|
||||||
|
|
||||||
trait LineReader
|
trait LineReader
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue