From fccbaafd4ffe5d686f8d5bedfdbc8e193967eddd Mon Sep 17 00:00:00 2001 From: bhou-crto Date: Fri, 9 Feb 2024 17:46:12 +0100 Subject: [PATCH 1/4] filter autocomplete options to improve performance --- internal/frontend/default-frontend.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/internal/frontend/default-frontend.go b/internal/frontend/default-frontend.go index 1697eb6..cc42398 100644 --- a/internal/frontend/default-frontend.go +++ b/internal/frontend/default-frontend.go @@ -173,8 +173,15 @@ func (self *defaultFrontend) addExecutableCommands() { return []string{}, cobra.ShellCompDirectiveNoFileComp } parts := strings.Split(output, "\n") - if len(parts) > 0 { - if strings.HasPrefix(parts[0], "#") { // skip the first control line, for further controls + // filter the parts that starts with toComplete + filteredParts := []string{} + for idx, p := range parts { + if strings.HasPrefix(p, toComplete) || (idx == 0 && strings.HasPrefix(p, "#")) { + filteredParts = append(filteredParts, p) + } + } + if len(filteredParts) > 0 { + if strings.HasPrefix(filteredParts[0], "#") { // skip the first control line, for further controls // the first line starting with # is the control line, it controls the completion behavior when the return body is empty shellDirective := cobra.ShellCompDirectiveNoFileComp switch strings.TrimSpace(strings.TrimLeft(parts[0], "#")) { @@ -185,9 +192,9 @@ func (self *defaultFrontend) addExecutableCommands() { case "no-file-completion": shellDirective = cobra.ShellCompDirectiveNoFileComp } - return parts[1:], shellDirective + return filteredParts[1:], shellDirective } - return parts, cobra.ShellCompDirectiveNoFileComp + return filteredParts, cobra.ShellCompDirectiveNoFileComp } } if len(validArgs) > 0 { From b783e0380e6c68b9f440485dc0319896b1763b29 Mon Sep 17 00:00:00 2001 From: bhou-crto Date: Fri, 9 Feb 2024 18:12:54 +0100 Subject: [PATCH 2/4] Pass [APPNAME]_TO_COMPLETE variable to complete cmd --- internal/frontend/default-frontend.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/internal/frontend/default-frontend.go b/internal/frontend/default-frontend.go index cc42398..7d961a0 100644 --- a/internal/frontend/default-frontend.go +++ b/internal/frontend/default-frontend.go @@ -168,7 +168,7 @@ func (self *defaultFrontend) addExecutableCommands() { } }) } - output, err := self.executeValidArgsOfCommand(group, name, originalArgs) + output, err := self.executeValidArgsOfCommand(group, name, originalArgs, toComplete) if err != nil { return []string{}, cobra.ShellCompDirectiveNoFileComp } @@ -288,13 +288,15 @@ func (self *defaultFrontend) executeCommand(group, name string, args []string, i } // execute the valid args command of the cdt command -func (self *defaultFrontend) executeValidArgsOfCommand(group, name string, args []string) (string, error) { +func (self *defaultFrontend) executeValidArgsOfCommand(group, name string, args []string, toComplete string) (string, error) { iCmd, err := self.getExecutableCommand(group, name) if err != nil { return "", err } - envCtx := self.getCmdEnvContext([]string{}, []string{}) + envCtx := self.getCmdEnvContext([]string{ + fmt.Sprintf("%s=%s", self.appCtx.EnvVarName("TO_COMPLETE"), toComplete), + }, []string{}) _, output, err := iCmd.ExecuteValidArgsCmd(envCtx, args...) if err != nil { From e9513e66faeb8cd804b647c4edb08b4d71618b59 Mon Sep 17 00:00:00 2001 From: bhou-crto Date: Mon, 11 Mar 2024 23:55:33 +0100 Subject: [PATCH 3/4] Add integration test for auto-complete filter --- test/integration/test-auto-complete.sh | 24 +++++++++++++++++++++ test/packages-src/bonjour/auto-complete.bat | 2 ++ test/packages-src/bonjour/auto-complete.sh | 1 + test/packages-src/bonjour/manifest.mf | 10 ++++++++- 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/test/integration/test-auto-complete.sh b/test/integration/test-auto-complete.sh index 7ec0b86..be3d230 100755 --- a/test/integration/test-auto-complete.sh +++ b/test/integration/test-auto-complete.sh @@ -52,6 +52,30 @@ else exit 1 fi +echo "> test dynamic argument auto-complete with prefix filter" +RESULT=$($CL_PATH __complete greeting saybonjour Jo) +echo "$RESULT" | grep -q "John" +if [ $? -eq 0 ]; then + echo "OK" +else + echo "KO - should auto-complete dynamic arguments" + exit 1 +fi +echo "$RESULT" | grep -q "Kate" +if [ $? -eq 0 ]; then + echo "KO - should only return options starts with the prefix" + exit 1 +else + echo "OK" +fi +echo "$RESULT" | grep -q "Jo$" +if [ $? -eq 0 ]; then + echo "OK" +else + echo "KO - should successfully inject TO_COMPLETE envrionment variable" + exit 1 +fi + echo "> test flag name auto-complete" RESULT=$($CL_PATH __complete bonjour -) echo "$RESULT" | grep -q "\-\-lang" diff --git a/test/packages-src/bonjour/auto-complete.bat b/test/packages-src/bonjour/auto-complete.bat index 1a8d374..2ea72b0 100755 --- a/test/packages-src/bonjour/auto-complete.bat +++ b/test/packages-src/bonjour/auto-complete.bat @@ -1,5 +1,7 @@ ECHO %* +ECHO %CL_TO_COMPLETE% + ECHO John ECHO Kate diff --git a/test/packages-src/bonjour/auto-complete.sh b/test/packages-src/bonjour/auto-complete.sh index ebda185..499e529 100755 --- a/test/packages-src/bonjour/auto-complete.sh +++ b/test/packages-src/bonjour/auto-complete.sh @@ -3,6 +3,7 @@ # first line print all the arguments to this script to check if all necessary arguments are passed to it echo "$@" +echo $CL_TO_COMPLETE echo "John" echo "Kate" diff --git a/test/packages-src/bonjour/manifest.mf b/test/packages-src/bonjour/manifest.mf index e755a21..a8d2b18 100644 --- a/test/packages-src/bonjour/manifest.mf +++ b/test/packages-src/bonjour/manifest.mf @@ -38,7 +38,15 @@ "executable": "{{.PackageDir}}/bonjour.{{if eq .Os \"windows\"}}bat{{else}}sh{{end}}", "args": [], "validArgsCmd": [ "{{.PackageDir}}/auto-complete.{{if eq .Os \"windows\"}}bat{{else}}sh{{end}}" ] + }, + { + "name": "saybonjour2", + "type": "executable", + "group": "greeting", + "short": "print bonjour from command launcher", + "executable": "{{.PackageDir}}/bonjour.{{if eq .Os \"windows\"}}bat{{else}}sh{{end}}", + "args": [], + "validArgsCmd": [ "{{.PackageDir}}/auto-complete.{{if eq .Os \"windows\"}}bat{{else}}sh{{end}}" ] } - ] } From ab5ff78dd7c52fc36aceeab4cb2a6123eee27ba6 Mon Sep 17 00:00:00 2001 From: bhou-crto Date: Fri, 15 Mar 2024 15:51:06 +0100 Subject: [PATCH 4/4] Remove unused command in test --- test/packages-src/bonjour/manifest.mf | 9 --------- 1 file changed, 9 deletions(-) diff --git a/test/packages-src/bonjour/manifest.mf b/test/packages-src/bonjour/manifest.mf index a8d2b18..ea1dc64 100644 --- a/test/packages-src/bonjour/manifest.mf +++ b/test/packages-src/bonjour/manifest.mf @@ -38,15 +38,6 @@ "executable": "{{.PackageDir}}/bonjour.{{if eq .Os \"windows\"}}bat{{else}}sh{{end}}", "args": [], "validArgsCmd": [ "{{.PackageDir}}/auto-complete.{{if eq .Os \"windows\"}}bat{{else}}sh{{end}}" ] - }, - { - "name": "saybonjour2", - "type": "executable", - "group": "greeting", - "short": "print bonjour from command launcher", - "executable": "{{.PackageDir}}/bonjour.{{if eq .Os \"windows\"}}bat{{else}}sh{{end}}", - "args": [], - "validArgsCmd": [ "{{.PackageDir}}/auto-complete.{{if eq .Os \"windows\"}}bat{{else}}sh{{end}}" ] } ] }