From 0afdfbd30d1011ec30f75a9f519f93b829ac6f62 Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Mon, 19 Sep 2022 09:33:00 -0400 Subject: [PATCH] Add support for completions in fish and powershell Fixes #3158 Note also that with Cobra 1.5, it is no longer necessary to have zsh >= 5.2 (see https://github.com/spf13/cobra/pull/1665) Signed-off-by: Marc Khouzam --- cli/core/pkg/command/completion.go | 32 ++++++++++++++++++++--- cli/core/pkg/command/completion_test.go | 34 +++++++++++++++++++++++-- 2 files changed, 61 insertions(+), 5 deletions(-) diff --git a/cli/core/pkg/command/completion.go b/cli/core/pkg/command/completion.go index 90be65b16f7..ebe3deca2f6 100644 --- a/cli/core/pkg/command/completion.go +++ b/cli/core/pkg/command/completion.go @@ -20,6 +20,8 @@ var ( completionShells = []string{ "bash", "zsh", + "fish", + "powershell", } completionLongDesc = dedent.Dedent(` @@ -28,8 +30,7 @@ var ( The shell completion code must be evaluated to provide completion. See Examples for how to perform this for your given shell. - Note for bash users: make sure the bash-completions package has been installed. - Note for zsh users: zsh >= 5.2 is required for command completion.`) + Note for bash users: make sure the bash-completions package has been installed.`) completionExamples = dedent.Dedent(` # Bash instructions: @@ -45,9 +46,30 @@ var ( # Zsh instructions: + ## Load only for current session: + autoload -U compinit; compinit + source <(tanzu completion zsh) + compdef _tanzu tanzu + ## Load for all new sessions: echo "autoload -U compinit; compinit" >> ~/.zshrc - tanzu completion zsh > "${fpath[1]}/_tanzu"`) + tanzu completion zsh > "${fpath[1]}/_tanzu" + + # Fish instructions: + + ## Load only for current session: + tanzu completion fish | source + + ## Load for all new sessions: + tanzu completion fish > ~/.config/fish/completions/tanzu.fish + + # Powershell instructions: + + ## Load only for current session: + tanzu completion powershell | Out-String | Invoke-Expression + + ## Load for all new sessions: + Add the output of the above command to your powershell profile.`) ) // completionCmd represents the completion command @@ -78,6 +100,10 @@ func runCompletion(out io.Writer, cmd *cobra.Command, args []string) error { return cmd.Root().GenBashCompletion(out) case "zsh": return cmd.Root().GenZshCompletion(out) + case "fish": + return cmd.Root().GenFishCompletion(out, true) + case "powershell", "pwsh": + return cmd.Root().GenPowerShellCompletionWithDesc(out) default: return errors.New("unrecognized shell type specified") } diff --git a/cli/core/pkg/command/completion_test.go b/cli/core/pkg/command/completion_test.go index 6d42b6bd258..f2e5a0758c6 100644 --- a/cli/core/pkg/command/completion_test.go +++ b/cli/core/pkg/command/completion_test.go @@ -75,7 +75,7 @@ func Test_runCompletion_Bash(t *testing.T) { // Check for a snippet of the bash completion output // TODO make this test less brittle if !strings.Contains(out.String(), "if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then") { - t.Errorf("Unexpected error returned for invalid shell argument: %s", out.String()) + t.Errorf("Unexpected output for the bash shell script: %s", out.String()) } } @@ -90,6 +90,36 @@ func Test_runCompletion_Zsh(t *testing.T) { // Check for a snippet of the zsh completion output if !strings.Contains(out.String(), "# For zsh, when completing a flag with an = (e.g., completion -n=)") { - t.Errorf("Unexpected error returned for invalid shell argument: %s", out.String()) + t.Errorf("Unexpected output for the zsh shell script: %s", out.String()) + } +} + +// Test_runCompletion_Fish validates functionality for fish shell completion. +func Test_runCompletion_Fish(t *testing.T) { + var out bytes.Buffer + args := []string{"fish"} + err := runCompletion(&out, completionCmd, args) + if err != nil { + t.Errorf("Unexpected error for valid shell: %v", err) + } + + // Check for a snippet of the zsh completion output + if !strings.Contains(out.String(), "# For Fish, when completing a flag with an = (e.g., -n=)") { + t.Errorf("Unexpected output for the fish shell script: %s", out.String()) + } +} + +// Test_runCompletion_Pwsh validates functionality for powershell completion. +func Test_runCompletion_Pwsh(t *testing.T) { + var out bytes.Buffer + args := []string{"powershell"} + err := runCompletion(&out, completionCmd, args) + if err != nil { + t.Errorf("Unexpected error for valid shell: %v", err) + } + + // Check for a snippet of the zsh completion output + if !strings.Contains(out.String(), "# PowerShell supports three different completion modes") { + t.Errorf("Unexpected output for the powershell script: %s", out.String()) } }