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:
eugene yokota 2024-10-23 10:14:39 -04:00 committed by GitHub
commit 36fb500f8c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 17 additions and 54 deletions

View File

@ -378,8 +378,8 @@ lazy val utilLogging = (project in file("internal") / "util-logging")
Seq(
jline,
jline3Terminal,
jline3JNA,
jline3Jansi,
jline3JNI,
jline3Native,
log4jApi,
log4jCore,
disruptor,

View File

@ -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 _ =>

View File

@ -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

View File

@ -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;

View File

@ -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"