Skip to content

Commit ea1b8ea

Browse files
feat: provide shell completion. Closes argoproj#619 (argoproj#1478)
* feat: provide shell completion. Closes argoproj#619 Signed-off-by: Kostis Kapelonis <[email protected]> * docs: autogenerated CLI navigation page Signed-off-by: Kostis Kapelonis <[email protected]>
1 parent c7933eb commit ea1b8ea

File tree

4 files changed

+168
-0
lines changed

4 files changed

+168
-0
lines changed

mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ nav:
6767
- Commands:
6868
- generated/kubectl-argo-rollouts/kubectl-argo-rollouts.md
6969
- generated/kubectl-argo-rollouts/kubectl-argo-rollouts_abort.md
70+
- generated/kubectl-argo-rollouts/kubectl-argo-rollouts_completion.md
7071
- generated/kubectl-argo-rollouts/kubectl-argo-rollouts_create.md
7172
- generated/kubectl-argo-rollouts/kubectl-argo-rollouts_create_analysisrun.md
7273
- generated/kubectl-argo-rollouts/kubectl-argo-rollouts_dashboard.md

pkg/kubectl-argo-rollouts/cmd/cmd.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cmd
33
import (
44
"github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1"
55
"github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/cmd/abort"
6+
"github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/cmd/completion"
67
"github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/cmd/create"
78
"github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/cmd/dashboard"
89
"github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/cmd/get"
@@ -72,5 +73,7 @@ func NewCmdArgoRollouts(o *options.ArgoRolloutsOptions) *cobra.Command {
7273
cmd.AddCommand(dashboard.NewCmdDashboard(o))
7374
cmd.AddCommand(status.NewCmdStatus(o))
7475
cmd.AddCommand(notificationcmd.NewToolsCommand("notifications", "kubectl argo rollouts notifications", v1alpha1.RolloutGVR, record.NewAPIFactorySettings()))
76+
cmd.AddCommand(completion.NewCmdCompletion(o))
77+
7578
return cmd
7679
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package completion
2+
3+
import (
4+
"github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/options"
5+
"github.com/spf13/cobra"
6+
)
7+
8+
func NewCmdCompletion(o *options.ArgoRolloutsOptions) *cobra.Command {
9+
var cmd = &cobra.Command{
10+
Use: "completion [bash|zsh|fish|powershell]",
11+
Short: "Generate completion script",
12+
Long: `To load completions:
13+
14+
Bash:
15+
16+
$ source <(yourprogram completion bash)
17+
18+
# To load completions for each session, execute once:
19+
# Linux:
20+
$ yourprogram completion bash > /etc/bash_completion.d/yourprogram
21+
# macOS:
22+
$ yourprogram completion bash > /usr/local/etc/bash_completion.d/yourprogram
23+
24+
Zsh:
25+
26+
# If shell completion is not already enabled in your environment,
27+
# you will need to enable it. You can execute the following once:
28+
29+
$ echo "autoload -U compinit; compinit" >> ~/.zshrc
30+
31+
# To load completions for each session, execute once:
32+
$ yourprogram completion zsh > "${fpath[1]}/_yourprogram"
33+
34+
# You will need to start a new shell for this setup to take effect.
35+
36+
fish:
37+
38+
$ yourprogram completion fish | source
39+
40+
# To load completions for each session, execute once:
41+
$ yourprogram completion fish > ~/.config/fish/completions/yourprogram.fish
42+
43+
PowerShell:
44+
45+
PS> yourprogram completion powershell | Out-String | Invoke-Expression
46+
47+
# To load completions for every new session, run:
48+
PS> yourprogram completion powershell > yourprogram.ps1
49+
# and source this file from your PowerShell profile.
50+
`,
51+
DisableFlagsInUseLine: true,
52+
ValidArgs: []string{"bash", "zsh", "fish", "powershell"},
53+
Args: cobra.ExactValidArgs(1),
54+
Run: func(cmd *cobra.Command, args []string) {
55+
switch args[0] {
56+
case "bash":
57+
cmd.Root().GenBashCompletion(o.Out)
58+
case "zsh":
59+
cmd.Root().GenZshCompletion(o.Out)
60+
case "fish":
61+
cmd.Root().GenFishCompletion(o.Out, true)
62+
case "powershell":
63+
cmd.Root().GenPowerShellCompletionWithDesc(o.Out)
64+
}
65+
},
66+
}
67+
return cmd
68+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package completion
2+
3+
import (
4+
"bytes"
5+
"testing"
6+
7+
options "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/options/fake"
8+
"github.com/tj/assert"
9+
)
10+
11+
func TestShellNotFound(t *testing.T) {
12+
tf, o := options.NewFakeArgoRolloutsOptions()
13+
defer tf.Cleanup()
14+
cmd := NewCmdCompletion(o)
15+
cmd.PersistentPreRunE = o.PersistentPreRunE
16+
cmd.SetArgs([]string{"does-not-exist"})
17+
err := cmd.Execute()
18+
19+
assert.Error(t, err)
20+
assert.Equal(t, "invalid argument \"does-not-exist\" for \"completion\"", err.Error())
21+
22+
stderr := o.ErrOut.(*bytes.Buffer).String()
23+
assert.Empty(t, stderr)
24+
25+
stdout := o.Out.(*bytes.Buffer).String()
26+
assert.Empty(t, stdout)
27+
28+
}
29+
30+
func TestFish(t *testing.T) {
31+
tf, o := options.NewFakeArgoRolloutsOptions()
32+
defer tf.Cleanup()
33+
cmd := NewCmdCompletion(o)
34+
cmd.PersistentPreRunE = o.PersistentPreRunE
35+
cmd.SetArgs([]string{"fish"})
36+
err := cmd.Execute()
37+
assert.NoError(t, err)
38+
39+
stderr := o.ErrOut.(*bytes.Buffer).String()
40+
assert.Empty(t, stderr)
41+
42+
stdout := o.Out.(*bytes.Buffer).String()
43+
assert.Contains(t, stdout, "fish completion")
44+
45+
}
46+
47+
func TestBash(t *testing.T) {
48+
tf, o := options.NewFakeArgoRolloutsOptions()
49+
defer tf.Cleanup()
50+
cmd := NewCmdCompletion(o)
51+
cmd.PersistentPreRunE = o.PersistentPreRunE
52+
cmd.SetArgs([]string{"bash"})
53+
err := cmd.Execute()
54+
assert.NoError(t, err)
55+
56+
stderr := o.ErrOut.(*bytes.Buffer).String()
57+
assert.Empty(t, stderr)
58+
59+
stdout := o.Out.(*bytes.Buffer).String()
60+
assert.Contains(t, stdout, "bash completion")
61+
62+
}
63+
64+
func TestZsh(t *testing.T) {
65+
tf, o := options.NewFakeArgoRolloutsOptions()
66+
defer tf.Cleanup()
67+
cmd := NewCmdCompletion(o)
68+
cmd.PersistentPreRunE = o.PersistentPreRunE
69+
cmd.SetArgs([]string{"zsh"})
70+
err := cmd.Execute()
71+
assert.NoError(t, err)
72+
73+
stderr := o.ErrOut.(*bytes.Buffer).String()
74+
assert.Empty(t, stderr)
75+
76+
stdout := o.Out.(*bytes.Buffer).String()
77+
assert.Contains(t, stdout, "zsh completion")
78+
79+
}
80+
81+
func TestPowershell(t *testing.T) {
82+
tf, o := options.NewFakeArgoRolloutsOptions()
83+
defer tf.Cleanup()
84+
cmd := NewCmdCompletion(o)
85+
cmd.PersistentPreRunE = o.PersistentPreRunE
86+
cmd.SetArgs([]string{"powershell"})
87+
err := cmd.Execute()
88+
assert.NoError(t, err)
89+
90+
stderr := o.ErrOut.(*bytes.Buffer).String()
91+
assert.Empty(t, stderr)
92+
93+
stdout := o.Out.(*bytes.Buffer).String()
94+
assert.Contains(t, stdout, "powershell completion")
95+
96+
}

0 commit comments

Comments
 (0)