mirror of https://github.com/sbt/sbt.git
Merge pull request #7811 from Friendseeker/use-jline-jni
[1.x] Use `jline-terminal-jni` to replace deprecated Jansi & JNA Provider
This commit is contained in:
commit
36fb500f8c
|
|
@ -378,8 +378,8 @@ lazy val utilLogging = (project in file("internal") / "util-logging")
|
|||
Seq(
|
||||
jline,
|
||||
jline3Terminal,
|
||||
jline3JNA,
|
||||
jline3Jansi,
|
||||
jline3JNI,
|
||||
jline3Native,
|
||||
log4jApi,
|
||||
log4jCore,
|
||||
disruptor,
|
||||
|
|
|
|||
|
|
@ -19,9 +19,7 @@ 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.JansiTerminalProvider
|
||||
import org.jline.terminal.spi.{ SystemStream, TerminalProvider }
|
||||
import org.jline.utils.OSUtils
|
||||
import scala.collection.JavaConverters._
|
||||
import scala.util.Try
|
||||
import java.util.concurrent.LinkedBlockingQueue
|
||||
|
|
@ -29,41 +27,13 @@ import java.util.concurrent.LinkedBlockingQueue
|
|||
private[sbt] object JLine3 {
|
||||
private[util] val initialAttributes = new AtomicReference[Attributes]
|
||||
|
||||
private[this] val forceWindowsJansiHolder = new AtomicBoolean(false)
|
||||
private[sbt] def forceWindowsJansi(): Unit = forceWindowsJansiHolder.set(true)
|
||||
private[this] def windowsJansi(): org.jline.terminal.Terminal = {
|
||||
val provider = new JansiTerminalProvider
|
||||
val termType = sys.props.get("org.jline.terminal.type").orElse(sys.env.get("TERM")).orNull
|
||||
provider.winSysTerminal(
|
||||
"console",
|
||||
termType,
|
||||
OSUtils.IS_CONEMU,
|
||||
Charset.forName("UTF-8"),
|
||||
false,
|
||||
SignalHandler.SIG_DFL,
|
||||
true,
|
||||
SystemStream.Output
|
||||
)
|
||||
}
|
||||
private val jansi = {
|
||||
val (major, minor) =
|
||||
(JansiTerminalProvider.getJansiMajorVersion, JansiTerminalProvider.getJansiMinorVersion)
|
||||
(major > 1 || minor >= 18) && Util.isWindows
|
||||
}
|
||||
private[util] def system: org.jline.terminal.Terminal = {
|
||||
val term =
|
||||
if (forceWindowsJansiHolder.get) windowsJansi()
|
||||
else {
|
||||
// Only use jna on windows. Both jna and jansi use illegal reflective
|
||||
// accesses on posix system.
|
||||
org.jline.terminal.TerminalBuilder
|
||||
.builder()
|
||||
.system(System.console != null)
|
||||
.jna(Util.isWindows && !jansi)
|
||||
.jansi(jansi)
|
||||
.paused(true)
|
||||
.build()
|
||||
}
|
||||
org.jline.terminal.TerminalBuilder
|
||||
.builder()
|
||||
.system(System.console != null)
|
||||
.paused(true)
|
||||
.build()
|
||||
initialAttributes.get match {
|
||||
case null => initialAttributes.set(term.getAttributes)
|
||||
case _ =>
|
||||
|
|
|
|||
|
|
@ -1237,7 +1237,6 @@ object NetworkClient {
|
|||
System.out.flush()
|
||||
})
|
||||
Runtime.getRuntime.addShutdownHook(hook)
|
||||
if (Util.isNonCygwinWindows) sbt.internal.util.JLine3.forceWindowsJansi()
|
||||
val parsed = parseArgs(restOfArgs)
|
||||
System.exit(Terminal.withStreams(isServer = false, isSubProcess = false) {
|
||||
val term = Terminal.console
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ import java.net.URL;
|
|||
import java.net.URLClassLoader;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
import java.util.Stack;
|
||||
import java.util.regex.Pattern;
|
||||
import xsbti.AppProvider;
|
||||
import xsbti.ScalaProvider;
|
||||
|
|
@ -65,32 +66,26 @@ public final class MetaBuildLoader extends URLClassLoader {
|
|||
* library.
|
||||
*/
|
||||
public static MetaBuildLoader makeLoader(final AppProvider appProvider) throws IOException {
|
||||
final String jlineJars = "jline-?[0-9.]+-sbt-.*|jline-terminal(-(jna|jansi))?-[0-9.]+";
|
||||
final String jlineJars =
|
||||
"jline-?[0-9.]+-sbt-.*|jline-terminal(-(jni))?-[0-9.]+|jline-native-[0-9.]+";
|
||||
final String testInterfaceJars = "test-interface(-.*)?";
|
||||
final String compilerInterfaceJars = "compiler-interface(-.*)?";
|
||||
final String utilInterfaceJars = "util-interface(-.*)?";
|
||||
final String jansiJars = "jansi-[0-9.]+";
|
||||
final String jnaJars = "jna-(platform-)?[0-9.]+";
|
||||
final String fullPattern =
|
||||
String.format(
|
||||
"^(%s|%s|%s|%s|%s|%s)\\.jar",
|
||||
jlineJars,
|
||||
testInterfaceJars,
|
||||
compilerInterfaceJars,
|
||||
utilInterfaceJars,
|
||||
jansiJars,
|
||||
jnaJars);
|
||||
"^(%s|%s|%s|%s|%s)\\.jar",
|
||||
jlineJars, testInterfaceJars, compilerInterfaceJars, utilInterfaceJars, jansiJars);
|
||||
final Pattern pattern = Pattern.compile(fullPattern);
|
||||
final File[] cp = appProvider.mainClasspath();
|
||||
final URL[] interfaceURLs = new URL[3];
|
||||
final URL[] jlineURLs = new URL[7];
|
||||
final Stack<URL> jlineURLs = new Stack<>();
|
||||
final File[] extra =
|
||||
appProvider.id().classpathExtra() == null ? new File[0] : appProvider.id().classpathExtra();
|
||||
final Set<File> bottomClasspath = new LinkedHashSet<>();
|
||||
|
||||
{
|
||||
int interfaceIndex = 0;
|
||||
int jlineIndex = 0;
|
||||
for (final File file : cp) {
|
||||
final String name = file.getName();
|
||||
if ((name.contains("test-interface")
|
||||
|
|
@ -100,8 +95,7 @@ public final class MetaBuildLoader extends URLClassLoader {
|
|||
interfaceURLs[interfaceIndex] = file.toURI().toURL();
|
||||
interfaceIndex += 1;
|
||||
} else if (pattern.matcher(name).find()) {
|
||||
jlineURLs[jlineIndex] = file.toURI().toURL();
|
||||
jlineIndex += 1;
|
||||
jlineURLs.push(file.toURI().toURL());
|
||||
} else {
|
||||
bottomClasspath.add(file);
|
||||
}
|
||||
|
|
@ -150,7 +144,7 @@ public final class MetaBuildLoader extends URLClassLoader {
|
|||
};
|
||||
|
||||
final SbtInterfaceLoader interfaceLoader = new SbtInterfaceLoader(interfaceURLs, topLoader);
|
||||
final JLineLoader jlineLoader = new JLineLoader(jlineURLs, interfaceLoader);
|
||||
final JLineLoader jlineLoader = new JLineLoader(jlineURLs.toArray(new URL[0]), interfaceLoader);
|
||||
final File[] siJars = scalaProvider.jars();
|
||||
final URL[] lib = new URL[1];
|
||||
int scalaRestCount = siJars.length - 1;
|
||||
|
|
|
|||
|
|
@ -89,8 +89,8 @@ object Dependencies {
|
|||
val jline = "org.scala-sbt.jline" % "jline" % "2.14.7-sbt-9c3b6aca11c57e339441442bbf58e550cdfecb79"
|
||||
val jline3Version = "3.27.0"
|
||||
val jline3Terminal = "org.jline" % "jline-terminal" % jline3Version
|
||||
val jline3Jansi = "org.jline" % "jline-terminal-jansi" % jline3Version
|
||||
val jline3JNA = "org.jline" % "jline-terminal-jna" % jline3Version
|
||||
val jline3JNI = "org.jline" % "jline-terminal-jni" % jline3Version
|
||||
val jline3Native = "org.jline" % "jline-native" % jline3Version
|
||||
val jline3Reader = "org.jline" % "jline-reader" % jline3Version
|
||||
val jline3Builtins = "org.jline" % "jline-builtins" % jline3Version
|
||||
val jansi = "org.fusesource.jansi" % "jansi" % "2.4.1"
|
||||
|
|
|
|||
Loading…
Reference in New Issue