Skip to content

Commit b9f6857

Browse files
authored
Merge pull request #240 from roots/improve-args-autocompletion-with-flags
Improve positional argument autocomplete when flags present
2 parents 98e9e66 + dd2156b commit b9f6857

File tree

10 files changed

+55
-24
lines changed

10 files changed

+55
-24
lines changed

cmd/deploy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ Options:
138138
}
139139

140140
func (c *DeployCommand) AutocompleteArgs() complete.Predictor {
141-
return c.Trellis.AutocompleteSite()
141+
return c.Trellis.AutocompleteSite(c.flags)
142142
}
143143

144144
func (c *DeployCommand) AutocompleteFlags() complete.Flags {

cmd/droplet_create.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -436,14 +436,14 @@ Options:
436436
}
437437

438438
func (c *DropletCreateCommand) AutocompleteArgs() complete.Predictor {
439-
return c.Trellis.PredictEnvironment()
439+
return c.Trellis.PredictEnvironment(c.flags)
440440
}
441441

442442
func (c *DropletCreateCommand) AutocompleteFlags() complete.Flags {
443443
return complete.Flags{
444444
"--region": complete.PredictNothing,
445445
"--size": complete.PredictNothing,
446446
"--skip--provision": complete.PredictNothing,
447-
"--ssh-key": complete.PredictFiles("*"),
447+
"--ssh-key": complete.PredictFiles("*.pub"),
448448
}
449449
}

cmd/provision.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ Options:
147147
}
148148

149149
func (c *ProvisionCommand) AutocompleteArgs() complete.Predictor {
150-
return c.Trellis.AutocompleteEnvironment()
150+
return c.Trellis.AutocompleteEnvironment(c.flags)
151151
}
152152

153153
func (c *ProvisionCommand) AutocompleteFlags() complete.Flags {

cmd/rollback.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ Options:
126126
}
127127

128128
func (c *RollbackCommand) AutocompleteArgs() complete.Predictor {
129-
return c.Trellis.AutocompleteSite()
129+
return c.Trellis.AutocompleteSite(c.flags)
130130
}
131131

132132
func (c *RollbackCommand) AutocompleteFlags() complete.Flags {

cmd/ssh.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cmd
22

33
import (
4+
"flag"
45
"fmt"
56
"strings"
67

@@ -105,7 +106,7 @@ Options:
105106
}
106107

107108
func (c *SshCommand) AutocompleteArgs() complete.Predictor {
108-
return c.Trellis.AutocompleteSite()
109+
return c.Trellis.AutocompleteSite(flag.NewFlagSet("", flag.ContinueOnError))
109110
}
110111

111112
func (c *SshCommand) AutocompleteFlags() complete.Flags {

cmd/vault_decrypt.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ Options:
130130
}
131131

132132
func (c *VaultDecryptCommand) AutocompleteArgs() complete.Predictor {
133-
return c.Trellis.AutocompleteEnvironment()
133+
return c.Trellis.AutocompleteEnvironment(c.flags)
134134
}
135135

136136
func (c *VaultDecryptCommand) AutocompleteFlags() complete.Flags {

cmd/vault_encrypt.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ Options:
164164
}
165165

166166
func (c *VaultEncryptCommand) AutocompleteArgs() complete.Predictor {
167-
return c.Trellis.AutocompleteEnvironment()
167+
return c.Trellis.AutocompleteEnvironment(c.flags)
168168
}
169169

170170
func (c *VaultEncryptCommand) AutocompleteFlags() complete.Flags {

cmd/vault_view.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ Options:
110110
}
111111

112112
func (c *VaultViewCommand) AutocompleteArgs() complete.Predictor {
113-
return c.Trellis.AutocompleteEnvironment()
113+
return c.Trellis.AutocompleteEnvironment(c.flags)
114114
}
115115

116116
func (c *VaultViewCommand) AutocompleteFlags() complete.Flags {

trellis/complete.go

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,30 @@
11
package trellis
22

33
import (
4+
"flag"
45
"github.com/posener/complete"
6+
"io"
57
)
68

7-
func (t *Trellis) AutocompleteSite() complete.Predictor {
8-
return t.PredictSite()
9+
func (t *Trellis) AutocompleteSite(flags *flag.FlagSet) complete.Predictor {
10+
return t.PredictSite(flags)
911
}
1012

11-
func (t *Trellis) AutocompleteEnvironment() complete.Predictor {
12-
return t.PredictEnvironment()
13+
func (t *Trellis) AutocompleteEnvironment(flags *flag.FlagSet) complete.Predictor {
14+
return t.PredictEnvironment(flags)
1315
}
1416

15-
func (t *Trellis) PredictSite() complete.PredictFunc {
17+
func (t *Trellis) PredictSite(flags *flag.FlagSet) complete.PredictFunc {
1618
return func(args complete.Args) []string {
1719
if err := t.LoadProject(); err != nil {
1820
return []string{}
1921
}
2022

21-
switch len(args.Completed) {
23+
flags.SetOutput(io.Discard)
24+
flags.Parse(args.Completed)
25+
cmdArgs := flags.Args()
26+
27+
switch len(cmdArgs) {
2228
case 0:
2329
return t.EnvironmentNames()
2430
case 1:
@@ -29,13 +35,17 @@ func (t *Trellis) PredictSite() complete.PredictFunc {
2935
}
3036
}
3137

32-
func (t *Trellis) PredictEnvironment() complete.PredictFunc {
38+
func (t *Trellis) PredictEnvironment(flags *flag.FlagSet) complete.PredictFunc {
3339
return func(args complete.Args) []string {
3440
if err := t.LoadProject(); err != nil {
3541
return []string{}
3642
}
3743

38-
switch len(args.Completed) {
44+
flags.SetOutput(io.Discard)
45+
flags.Parse(args.Completed)
46+
cmdArgs := flags.Args()
47+
48+
switch len(cmdArgs) {
3949
case 0:
4050
return t.EnvironmentNames()
4151
default:

trellis/complete_test.go

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package trellis
22

33
import (
44
"bytes"
5+
"flag"
56
"io"
67
"os"
78
"reflect"
@@ -29,24 +30,43 @@ func TestCompletionFunctions(t *testing.T) {
2930
t.Fatalf(err.Error())
3031
}
3132

33+
flags := flag.NewFlagSet("", flag.ContinueOnError)
34+
flags.SetOutput(io.Discard)
35+
36+
flagsPredictor := complete.Flags{
37+
"--branch": complete.PredictNothing,
38+
}
39+
3240
cases := []struct {
3341
Predictor complete.Predictor
3442
Completed []string
3543
Last string
3644
Expected []string
3745
}{
38-
{trellis.AutocompleteEnvironment(), []string{"deploy"}, "", []string{"development", "valet-link", "production"}},
39-
{trellis.AutocompleteEnvironment(), []string{"deploy"}, "d", []string{"development"}},
40-
{trellis.AutocompleteEnvironment(), []string{"deploy", "production"}, "", nil},
41-
{trellis.AutocompleteSite(), []string{"deploy"}, "", []string{"development", "valet-link", "production"}},
42-
{trellis.AutocompleteSite(), []string{"deploy"}, "d", []string{"development"}},
43-
{trellis.AutocompleteSite(), []string{"deploy", "production"}, "", []string{"example.com"}},
46+
{trellis.AutocompleteEnvironment(flags), []string{"deploy"}, "", []string{"development", "valet-link", "production"}},
47+
{trellis.AutocompleteEnvironment(flags), []string{"deploy"}, "d", []string{"development"}},
48+
{trellis.AutocompleteEnvironment(flags), []string{"deploy", "production"}, "", nil},
49+
{trellis.AutocompleteEnvironment(flags), []string{"deploy"}, "--b", []string{"--branch"}},
50+
{trellis.AutocompleteEnvironment(flags), []string{"deploy", "--branch=foo"}, "", []string{"development", "valet-link", "production"}},
51+
{trellis.AutocompleteEnvironment(flags), []string{"deploy", "--branch=foo"}, "pro", []string{"production"}},
52+
{trellis.AutocompleteSite(flags), []string{"deploy"}, "", []string{"development", "valet-link", "production"}},
53+
{trellis.AutocompleteSite(flags), []string{"deploy"}, "d", []string{"development"}},
54+
{trellis.AutocompleteSite(flags), []string{"deploy", "production"}, "", []string{"example.com"}},
55+
{trellis.AutocompleteSite(flags), []string{"deploy", "--branch=foo"}, "dev", []string{"development"}},
56+
{trellis.AutocompleteSite(flags), []string{"deploy", "--branch=foo", "production"}, "", []string{"example.com"}},
57+
{trellis.AutocompleteSite(flags), []string{"deploy", "--branch=foo", "production"}, "example", []string{"example.com"}},
4458
}
4559

4660
for _, tc := range cases {
4761
t.Run(tc.Last, func(t *testing.T) {
62+
var flagValue string
63+
64+
flags = flag.NewFlagSet("", flag.ContinueOnError)
65+
flags.StringVar(&flagValue, "branch", "", "Branch name")
66+
4867
command := new(cli.MockCommandAutocomplete)
4968
command.AutocompleteArgsValue = tc.Predictor
69+
command.AutocompleteFlagsValue = flagsPredictor
5070

5171
cli := &cli.CLI{
5272
Commands: map[string]cli.CommandFactory{
@@ -104,7 +124,7 @@ func TestCompletionFunctions(t *testing.T) {
104124
sort.Strings(tc.Expected)
105125

106126
if !reflect.DeepEqual(actual, tc.Expected) {
107-
t.Fatalf("bad:\n\n%#v\n\n%#v", actual, tc.Expected)
127+
t.Fatalf("\n\nExpected:\n%#v\n\nActual:\n%#v", tc.Expected, actual)
108128
}
109129
})
110130
}

0 commit comments

Comments
 (0)