This is an automated email from the ASF dual-hosted git repository.
apkhmv pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new 104b4903ba IGNITE-21674 Fix subcommand completion in CLI (#3461)
104b4903ba is described below
commit 104b4903baaacfe5be1226eb21de874217e1fc1c
Author: Vadim Pakhnushev <[email protected]>
AuthorDate: Fri Mar 22 16:18:45 2024 +0300
IGNITE-21674 Fix subcommand completion in CLI (#3461)
Add a workaround for https://github.com/jline/jline3/issues/956
---
.../core/repl/executor/IgnitePicocliCommands.java | 80 ++++++++++++++--------
1 file changed, 53 insertions(+), 27 deletions(-)
diff --git
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/IgnitePicocliCommands.java
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/IgnitePicocliCommands.java
index 7a654326b7..914d1a2492 100644
---
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/IgnitePicocliCommands.java
+++
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/IgnitePicocliCommands.java
@@ -19,11 +19,11 @@ package org.apache.ignite.internal.cli.core.repl.executor;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import org.apache.ignite.internal.cli.core.repl.completer.DynamicCompleter;
import
org.apache.ignite.internal.cli.core.repl.completer.DynamicCompleterRegistry;
import
org.apache.ignite.internal.cli.core.repl.completer.filter.CompleterFilter;
import org.jline.builtins.Options.HelpException;
@@ -31,7 +31,6 @@ import org.jline.console.ArgDesc;
import org.jline.console.CmdDesc;
import org.jline.console.CommandRegistry;
import org.jline.reader.Candidate;
-import org.jline.reader.Completer;
import org.jline.reader.LineReader;
import org.jline.reader.ParsedLine;
import org.jline.reader.impl.completer.ArgumentCompleter;
@@ -179,7 +178,7 @@ public class IgnitePicocliCommands implements
CommandRegistry {
return aliasCommand;
}
- private class IgnitePicocliCompleter extends ArgumentCompleter implements
Completer {
+ private class IgnitePicocliCompleter extends ArgumentCompleter {
public IgnitePicocliCompleter() {
super(NullCompleter.INSTANCE);
@@ -199,35 +198,31 @@ public class IgnitePicocliCommands implements
CommandRegistry {
0,
commandLine.cursor(),
cs);
- String[] staticCandidates = cs.stream()
- .map(CharSequence::toString)
- .toArray(String[]::new);
-
- List<DynamicCompleter> completers =
completerRegistry.findCompleters(words);
- if (!completers.isEmpty()) {
- try {
- completers.stream()
- .map(c -> c.complete(words))
- .flatMap(List::stream)
- .map(this::dynamicCandidate)
- .forEach(candidates::add);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- if (!candidates.isEmpty()) {
- return;
+ try {
+ completerRegistry.findCompleters(words).stream()
+ .map(c -> c.complete(words))
+ .flatMap(List::stream)
+ .map(this::dynamicCandidate)
+ .forEach(candidates::add);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
}
- String[] filteredCandidates = staticCandidates;
- for (CompleterFilter filter : completerFilters) {
- filteredCandidates = filter.filter(words, filteredCandidates);
- }
+ if (candidates.isEmpty()) {
+ String[] filteredCandidates = cs.stream()
+ .map(CharSequence::toString)
+ .toArray(String[]::new);
+ for (CompleterFilter filter : completerFilters) {
+ filteredCandidates = filter.filter(words,
filteredCandidates);
+ }
- for (String c : filteredCandidates) {
- candidates.add(staticCandidate(c));
+ for (String c : filteredCandidates) {
+ candidates.add(staticCandidate(c));
+ }
}
+
+ sortCandidates(candidates);
}
private Candidate dynamicCandidate(String one) {
@@ -241,5 +236,36 @@ public class IgnitePicocliCommands implements
CommandRegistry {
private Candidate staticCandidate(String one) {
return new Candidate(one, one, null, null, null, null, true, 10);
}
+
+ /**
+ * When custom sort order is used, sort candidates list and reassign
sort order according to candidates order.
+ * TODO https://issues.apache.org/jira/browse/IGNITE-21824
+ *
+ * @param candidates List of candidates.
+ */
+ private void sortCandidates(List<Candidate> candidates) {
+ boolean customOrder = candidates.stream().anyMatch(c -> c.sort()
!= 0);
+ if (!customOrder) {
+ return;
+ }
+ Collections.sort(candidates);
+ List<Candidate> newCandidates = new ArrayList<>(candidates.size());
+ for (int i = 0; i < candidates.size(); i++) {
+ Candidate candidate = candidates.get(i);
+ Candidate newCandidate = new Candidate(
+ candidate.value(),
+ candidate.displ(),
+ candidate.group(),
+ candidate.descr(),
+ candidate.suffix(),
+ candidate.key(),
+ candidate.complete(),
+ i // override sort order
+ );
+ newCandidates.add(newCandidate);
+ }
+ candidates.clear();
+ candidates.addAll(newCandidates);
+ }
}
}