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 <8614891+valep...@users.noreply.github.com> 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); + } } }