From e9a659098e30909ef683d0287b88fb6c2c5b4729 Mon Sep 17 00:00:00 2001 From: Aleksandr Polovtsev Date: Mon, 9 Mar 2026 17:30:49 +0200 Subject: [PATCH] IGNITE-28112 Bump jline from 3.29.0 to 4.0.0 --- gradle/libs.versions.toml | 2 +- .../core/flow/question/JlineQuestionWriterReader.java | 10 +++++++++- .../internal/cli/commands/sql/SqlCompleterTest.java | 8 +++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9aca254c0259..e4ba51d64596 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -31,7 +31,7 @@ netty = "4.2.10.Final" javapoet = "1.13.0" javax = "1.3.2" jetbrainsAnnotations = "26.0.2-1" -jline = "3.29.0" +jline = "4.0.0" jmh = "1.37" junit5 = "5.14.3" junit5-platform = "1.14.2" diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/flow/question/JlineQuestionWriterReader.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/flow/question/JlineQuestionWriterReader.java index 3ebd96fa53d1..a8185d715f12 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/flow/question/JlineQuestionWriterReader.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/flow/question/JlineQuestionWriterReader.java @@ -38,7 +38,15 @@ public JlineQuestionWriterReader(LineReader reader) { @Override public String readAnswer(String question, boolean maskInput) { try { - MaskingCallback callback = maskInput ? new SimpleMaskingCallback('*') : null; + // Masking callback triggers jline's "mask thread" on dumb terminals, which repeatedly + // writes clearing sequences to the terminal output. On dumb terminals with 0x0 size, + // the mask thread is never stopped (doCleanup skips stopMaskThread), causing test + // failures and disruptive output on real dumb terminals. Since display operations are + // no-ops on 0x0 terminals anyway, skipping the masking callback on dumb terminals + // preserves the same visual behavior as jline 3. + boolean dumb = "dumb".equals(reader.getTerminal().getType()) + || "dumb-color".equals(reader.getTerminal().getType()); + MaskingCallback callback = (maskInput && !dumb) ? new SimpleMaskingCallback('*') : null; return reader.readLine(question, null, callback, null); } catch (UserInterruptException /* Ctrl-C pressed */ | EndOfFileException /* Ctrl-D pressed */ ignored) { throw new FlowInterruptException(); diff --git a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/sql/SqlCompleterTest.java b/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/sql/SqlCompleterTest.java index 9fb48f62ddec..ce44a90e1960 100644 --- a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/sql/SqlCompleterTest.java +++ b/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/sql/SqlCompleterTest.java @@ -37,6 +37,9 @@ void testCandidatesForEmptyLineDontContainExtraKeywordsOrSchema() { List.of(""), 0, 0, + 0, + "", + 0, 0 ), candidates @@ -54,7 +57,10 @@ void testCandidatesForSecondWordContainExtraKeywordsAndSchema() { List.of("select", ""), 1, 0, - 6 + 6, + "", + 0, + 0 ), candidates );