diff options
Diffstat (limited to 'commands')
-rw-r--r-- | commands/bridge_auth_addtoken.go | 2 | ||||
-rw-r--r-- | commands/bridge_auth_rm.go | 3 | ||||
-rw-r--r-- | commands/bridge_auth_show.go | 3 | ||||
-rw-r--r-- | commands/bridge_configure.go | 1 | ||||
-rw-r--r-- | commands/bridge_pull.go | 3 | ||||
-rw-r--r-- | commands/bridge_push.go | 3 | ||||
-rw-r--r-- | commands/bridge_rm.go | 3 | ||||
-rw-r--r-- | commands/comment.go | 1 | ||||
-rw-r--r-- | commands/comment_add.go | 1 | ||||
-rw-r--r-- | commands/helper_completion.go | 342 | ||||
-rw-r--r-- | commands/label.go | 1 | ||||
-rw-r--r-- | commands/label_add.go | 1 | ||||
-rw-r--r-- | commands/label_rm.go | 1 | ||||
-rw-r--r-- | commands/ls.go | 34 | ||||
-rw-r--r-- | commands/ls_test.go | 43 | ||||
-rw-r--r-- | commands/pull.go | 1 | ||||
-rw-r--r-- | commands/push.go | 1 | ||||
-rw-r--r-- | commands/rm.go | 1 | ||||
-rw-r--r-- | commands/root.go | 8 | ||||
-rw-r--r-- | commands/select.go | 1 | ||||
-rw-r--r-- | commands/show.go | 6 | ||||
-rw-r--r-- | commands/status.go | 1 | ||||
-rw-r--r-- | commands/title.go | 1 | ||||
-rw-r--r-- | commands/title_edit.go | 1 | ||||
-rw-r--r-- | commands/user.go | 6 | ||||
-rw-r--r-- | commands/user_adopt.go | 1 | ||||
-rw-r--r-- | commands/user_ls.go | 1 |
27 files changed, 449 insertions, 22 deletions
diff --git a/commands/bridge_auth_addtoken.go b/commands/bridge_auth_addtoken.go index c0458fda..dfdc66b6 100644 --- a/commands/bridge_auth_addtoken.go +++ b/commands/bridge_auth_addtoken.go @@ -41,10 +41,12 @@ func newBridgeAuthAddTokenCommand() *cobra.Command { flags.StringVarP(&options.target, "target", "t", "", fmt.Sprintf("The target of the bridge. Valid values are [%s]", strings.Join(bridge.Targets(), ","))) + cmd.RegisterFlagCompletionFunc("target", completeFrom(bridge.Targets())) flags.StringVarP(&options.login, "login", "l", "", "The login in the remote bug-tracker") flags.StringVarP(&options.user, "user", "u", "", "The user to add the token to. Default is the current user") + cmd.RegisterFlagCompletionFunc("user", completeUser(env)) return cmd } diff --git a/commands/bridge_auth_rm.go b/commands/bridge_auth_rm.go index fa73ad11..a28057de 100644 --- a/commands/bridge_auth_rm.go +++ b/commands/bridge_auth_rm.go @@ -16,7 +16,8 @@ func newBridgeAuthRm() *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { return runBridgeAuthRm(env, args) }, - Args: cobra.ExactArgs(1), + Args: cobra.ExactArgs(1), + ValidArgsFunction: completeBridgeAuth(env), } return cmd diff --git a/commands/bridge_auth_show.go b/commands/bridge_auth_show.go index f174cdb7..7233bb51 100644 --- a/commands/bridge_auth_show.go +++ b/commands/bridge_auth_show.go @@ -21,7 +21,8 @@ func newBridgeAuthShow() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runBridgeAuthShow(env, args) }), - Args: cobra.ExactArgs(1), + Args: cobra.ExactArgs(1), + ValidArgsFunction: completeBridgeAuth(env), } return cmd diff --git a/commands/bridge_configure.go b/commands/bridge_configure.go index 6533e497..bbfc13be 100644 --- a/commands/bridge_configure.go +++ b/commands/bridge_configure.go @@ -97,6 +97,7 @@ git bug bridge configure \ flags.StringVarP(&options.name, "name", "n", "", "A distinctive name to identify the bridge") flags.StringVarP(&options.target, "target", "t", "", fmt.Sprintf("The target of the bridge. Valid values are [%s]", strings.Join(bridge.Targets(), ","))) + cmd.RegisterFlagCompletionFunc("target", completeFrom(bridge.Targets())) flags.StringVarP(&options.params.URL, "url", "u", "", "The URL of the remote repository") flags.StringVarP(&options.params.BaseURL, "base-url", "b", "", "The base URL of your remote issue tracker") flags.StringVarP(&options.params.Login, "login", "l", "", "The login on your remote issue tracker") diff --git a/commands/bridge_pull.go b/commands/bridge_pull.go index 3155ebf4..9370e088 100644 --- a/commands/bridge_pull.go +++ b/commands/bridge_pull.go @@ -32,7 +32,8 @@ func newBridgePullCommand() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runBridgePull(env, options, args) }), - Args: cobra.MaximumNArgs(1), + Args: cobra.MaximumNArgs(1), + ValidArgsFunction: completeBridge(env), } flags := cmd.Flags() diff --git a/commands/bridge_push.go b/commands/bridge_push.go index a232f0f0..ef1f2d3e 100644 --- a/commands/bridge_push.go +++ b/commands/bridge_push.go @@ -23,7 +23,8 @@ func newBridgePushCommand() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runBridgePush(env, args) }), - Args: cobra.MaximumNArgs(1), + Args: cobra.MaximumNArgs(1), + ValidArgsFunction: completeBridge(env), } return cmd diff --git a/commands/bridge_rm.go b/commands/bridge_rm.go index 121a35ad..0306944e 100644 --- a/commands/bridge_rm.go +++ b/commands/bridge_rm.go @@ -16,7 +16,8 @@ func newBridgeRm() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runBridgeRm(env, args) }), - Args: cobra.ExactArgs(1), + Args: cobra.ExactArgs(1), + ValidArgsFunction: completeBridge(env), } return cmd diff --git a/commands/comment.go b/commands/comment.go index 90657e4a..b4b4628b 100644 --- a/commands/comment.go +++ b/commands/comment.go @@ -18,6 +18,7 @@ func newCommentCommand() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runComment(env, args) }), + ValidArgsFunction: completeBug(env), } cmd.AddCommand(newCommentAddCommand()) diff --git a/commands/comment_add.go b/commands/comment_add.go index 11ba5ad3..f308428c 100644 --- a/commands/comment_add.go +++ b/commands/comment_add.go @@ -25,6 +25,7 @@ func newCommentAddCommand() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runCommentAdd(env, options, args) }), + ValidArgsFunction: completeBug(env), } flags := cmd.Flags() diff --git a/commands/helper_completion.go b/commands/helper_completion.go new file mode 100644 index 00000000..3a089e35 --- /dev/null +++ b/commands/helper_completion.go @@ -0,0 +1,342 @@ +package commands + +import ( + "fmt" + "sort" + "strings" + + "github.com/spf13/cobra" + + "github.com/MichaelMure/git-bug/bridge" + "github.com/MichaelMure/git-bug/bridge/core/auth" + "github.com/MichaelMure/git-bug/bug" + "github.com/MichaelMure/git-bug/cache" + _select "github.com/MichaelMure/git-bug/commands/select" +) + +type validArgsFunction func(cmd *cobra.Command, args []string, toComplete string) (completions []string, directives cobra.ShellCompDirective) + +func completionHandlerError(err error) (completions []string, directives cobra.ShellCompDirective) { + return nil, cobra.ShellCompDirectiveError +} + +func completeBridge(env *Env) validArgsFunction { + return func(cmd *cobra.Command, args []string, toComplete string) (completions []string, directives cobra.ShellCompDirective) { + if err := loadBackend(env)(cmd, args); err != nil { + return completionHandlerError(err) + } + defer func() { + _ = env.backend.Close() + }() + + bridges, err := bridge.ConfiguredBridges(env.backend) + if err != nil { + return completionHandlerError(err) + } + + completions = make([]string, len(bridges)) + for i, bridge := range bridges { + completions[i] = bridge + "\t" + "Bridge" + } + + return completions, cobra.ShellCompDirectiveNoFileComp + } +} + +func completeBridgeAuth(env *Env) validArgsFunction { + return func(cmd *cobra.Command, args []string, toComplete string) (completions []string, directives cobra.ShellCompDirective) { + if err := loadBackend(env)(cmd, args); err != nil { + return completionHandlerError(err) + } + defer func() { + _ = env.backend.Close() + }() + + creds, err := auth.List(env.backend) + if err != nil { + return completionHandlerError(err) + } + + completions = make([]string, len(creds)) + for i, cred := range creds { + meta := make([]string, 0, len(cred.Metadata())) + for k, v := range cred.Metadata() { + meta = append(meta, k+":"+v) + } + sort.Strings(meta) + metaFmt := strings.Join(meta, ",") + + completions[i] = cred.ID().Human() + "\t" + cred.Target() + " " + string(cred.Kind()) + " " + metaFmt + } + + return completions, cobra.ShellCompDirectiveNoFileComp + } +} + +func completeBug(env *Env) validArgsFunction { + return func(cmd *cobra.Command, args []string, toComplete string) (completions []string, directives cobra.ShellCompDirective) { + if err := loadBackend(env)(cmd, args); err != nil { + return completionHandlerError(err) + } + defer func() { + _ = env.backend.Close() + }() + + return completeBugWithBackend(env.backend, toComplete) + } +} + +func completeBugWithBackend(backend *cache.RepoCache, toComplete string) (completions []string, directives cobra.ShellCompDirective) { + allIds := backend.AllBugsIds() + bugExcerpt := make([]*cache.BugExcerpt, len(allIds)) + for i, id := range allIds { + var err error + bugExcerpt[i], err = backend.ResolveBugExcerpt(id) + if err != nil { + return completionHandlerError(err) + } + } + + for i, id := range allIds { + if strings.Contains(id.String(), strings.TrimSpace(toComplete)) { + completions = append(completions, id.Human()+"\t"+bugExcerpt[i].Title) + } + } + + return completions, cobra.ShellCompDirectiveNoFileComp +} + +func completeBugAndLabels(env *Env, addOrRemove bool) validArgsFunction { + return func(cmd *cobra.Command, args []string, toComplete string) (completions []string, directives cobra.ShellCompDirective) { + if err := loadBackend(env)(cmd, args); err != nil { + return completionHandlerError(err) + } + defer func() { + _ = env.backend.Close() + }() + + b, args, err := _select.ResolveBug(env.backend, args) + if err == _select.ErrNoValidId { + // we need a bug first to complete labels + return completeBugWithBackend(env.backend, toComplete) + } + if err != nil { + return completionHandlerError(err) + } + + snap := b.Snapshot() + + seenLabels := map[bug.Label]bool{} + for _, label := range args { + seenLabels[bug.Label(label)] = addOrRemove + } + + var labels []bug.Label + if addOrRemove { + for _, label := range snap.Labels { + seenLabels[label] = true + } + + allLabels := env.backend.ValidLabels() + labels = make([]bug.Label, 0, len(allLabels)) + for _, label := range allLabels { + if !seenLabels[label] { + labels = append(labels, label) + } + } + } else { + labels = make([]bug.Label, 0, len(snap.Labels)) + for _, label := range snap.Labels { + if seenLabels[label] { + labels = append(labels, label) + } + } + } + + completions = make([]string, len(labels)) + for i, label := range labels { + completions[i] = string(label) + "\t" + "Label" + } + + return completions, cobra.ShellCompDirectiveNoFileComp + } +} + +func completeFrom(choices []string) validArgsFunction { + return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + return choices, cobra.ShellCompDirectiveNoFileComp + } +} + +func completeGitRemote(env *Env) validArgsFunction { + return func(cmd *cobra.Command, args []string, toComplete string) (completions []string, directives cobra.ShellCompDirective) { + if err := loadBackend(env)(cmd, args); err != nil { + return completionHandlerError(err) + } + defer func() { + _ = env.backend.Close() + }() + + remoteMap, err := env.backend.GetRemotes() + if err != nil { + return completionHandlerError(err) + } + completions = make([]string, 0, len(remoteMap)) + for remote, url := range remoteMap { + completions = append(completions, remote+"\t"+"Remote: "+url) + } + sort.Strings(completions) + return completions, cobra.ShellCompDirectiveNoFileComp + } +} + +func completeLabel(env *Env) validArgsFunction { + return func(cmd *cobra.Command, args []string, toComplete string) (completions []string, directives cobra.ShellCompDirective) { + if err := loadBackend(env)(cmd, args); err != nil { + return completionHandlerError(err) + } + defer func() { + _ = env.backend.Close() + }() + + labels := env.backend.ValidLabels() + completions = make([]string, len(labels)) + for i, label := range labels { + if strings.Contains(label.String(), " ") { + completions[i] = fmt.Sprintf("\"%s\"\tLabel", label.String()) + } else { + completions[i] = fmt.Sprintf("%s\tLabel", label.String()) + } + } + return completions, cobra.ShellCompDirectiveNoFileComp + } +} + +func completeLs(env *Env) validArgsFunction { + return func(cmd *cobra.Command, args []string, toComplete string) (completions []string, directives cobra.ShellCompDirective) { + if strings.HasPrefix(toComplete, "status:") { + completions = append(completions, "status:open\tOpen bugs") + completions = append(completions, "status:closed\tClosed bugs") + return completions, cobra.ShellCompDirectiveDefault + } + + byPerson := []string{"author:", "participant:", "actor:"} + byLabel := []string{"label:", "no:"} + needBackend := false + for _, key := range append(byPerson, byLabel...) { + if strings.HasPrefix(toComplete, key) { + needBackend = true + } + } + + if needBackend { + if err := loadBackend(env)(cmd, args); err != nil { + return completionHandlerError(err) + } + defer func() { + _ = env.backend.Close() + }() + } + + for _, key := range byPerson { + if !strings.HasPrefix(toComplete, key) { + continue + } + ids := env.backend.AllIdentityIds() + completions = make([]string, len(ids)) + for i, id := range ids { + user, err := env.backend.ResolveIdentityExcerpt(id) + if err != nil { + return completionHandlerError(err) + } + var handle string + if user.Login != "" { + handle = user.Login + } else { + // "author:John Doe" does not work yet, so use the first name. + handle = strings.Split(user.Name, " ")[0] + } + completions[i] = key + handle + "\t" + user.DisplayName() + } + return completions, cobra.ShellCompDirectiveNoFileComp + } + + for _, key := range byLabel { + if !strings.HasPrefix(toComplete, key) { + continue + } + labels := env.backend.ValidLabels() + completions = make([]string, len(labels)) + for i, label := range labels { + if strings.Contains(label.String(), " ") { + completions[i] = key + "\"" + string(label) + "\"" + } else { + completions[i] = key + string(label) + } + } + return completions, cobra.ShellCompDirectiveNoFileComp + } + + completions = []string{ + "actor:\tFilter by actor", + "author:\tFilter by author", + "label:\tFilter by label", + "no:\tExclude bugs by label", + "participant:\tFilter by participant", + "status:\tFilter by open/close status", + "title:\tFilter by title", + } + return completions, cobra.ShellCompDirectiveNoSpace + } +} + +func completeUser(env *Env) validArgsFunction { + return func(cmd *cobra.Command, args []string, toComplete string) (completions []string, directives cobra.ShellCompDirective) { + if err := loadBackend(env)(cmd, args); err != nil { + return completionHandlerError(err) + } + defer func() { + _ = env.backend.Close() + }() + + ids := env.backend.AllIdentityIds() + completions = make([]string, len(ids)) + for i, id := range ids { + user, err := env.backend.ResolveIdentityExcerpt(id) + if err != nil { + return completionHandlerError(err) + } + completions[i] = user.Id.Human() + "\t" + user.DisplayName() + } + return completions, cobra.ShellCompDirectiveNoFileComp + } +} + +func completeUserForQuery(env *Env) validArgsFunction { + return func(cmd *cobra.Command, args []string, toComplete string) (completions []string, directives cobra.ShellCompDirective) { + if err := loadBackend(env)(cmd, args); err != nil { + return completionHandlerError(err) + } + defer func() { + _ = env.backend.Close() + }() + + ids := env.backend.AllIdentityIds() + completions = make([]string, len(ids)) + for i, id := range ids { + user, err := env.backend.ResolveIdentityExcerpt(id) + if err != nil { + return completionHandlerError(err) + } + var handle string + if user.Login != "" { + handle = user.Login + } else { + // "author:John Doe" does not work yet, so use the first name. + handle = strings.Split(user.Name, " ")[0] + } + completions[i] = handle + "\t" + user.DisplayName() + } + return completions, cobra.ShellCompDirectiveNoFileComp + } +} diff --git a/commands/label.go b/commands/label.go index d108b089..906974a5 100644 --- a/commands/label.go +++ b/commands/label.go @@ -16,6 +16,7 @@ func newLabelCommand() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runLabel(env, args) }), + ValidArgsFunction: completeBug(env), } cmd.AddCommand(newLabelAddCommand()) diff --git a/commands/label_add.go b/commands/label_add.go index c60ecfeb..65439a4a 100644 --- a/commands/label_add.go +++ b/commands/label_add.go @@ -17,6 +17,7 @@ func newLabelAddCommand() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runLabelAdd(env, args) }), + ValidArgsFunction: completeBugAndLabels(env, true), } return cmd diff --git a/commands/label_rm.go b/commands/label_rm.go index 1cdcd248..3f4e1958 100644 --- a/commands/label_rm.go +++ b/commands/label_rm.go @@ -17,6 +17,7 @@ func newLabelRmCommand() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runLabelRm(env, args) }), + ValidArgsFunction: completeBugAndLabels(env, false), } return cmd diff --git a/commands/ls.go b/commands/ls.go index db4145d0..da5ea8ce 100644 --- a/commands/ls.go +++ b/commands/ls.go @@ -56,6 +56,7 @@ git bug ls status:open --by creation "foo bar" baz RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runLs(env, options, args) }), + ValidArgsFunction: completeLs(env), } flags := cmd.Flags() @@ -63,26 +64,36 @@ git bug ls status:open --by creation "foo bar" baz flags.StringSliceVarP(&options.statusQuery, "status", "s", nil, "Filter by status. Valid values are [open,closed]") + cmd.RegisterFlagCompletionFunc("status", completeFrom([]string{"open", "closed"})) flags.StringSliceVarP(&options.authorQuery, "author", "a", nil, "Filter by author") flags.StringSliceVarP(&options.metadataQuery, "metadata", "m", nil, "Filter by metadata. Example: github-url=URL") + cmd.RegisterFlagCompletionFunc("author", completeUserForQuery(env)) flags.StringSliceVarP(&options.participantQuery, "participant", "p", nil, "Filter by participant") + cmd.RegisterFlagCompletionFunc("participant", completeUserForQuery(env)) flags.StringSliceVarP(&options.actorQuery, "actor", "A", nil, "Filter by actor") + cmd.RegisterFlagCompletionFunc("actor", completeUserForQuery(env)) flags.StringSliceVarP(&options.labelQuery, "label", "l", nil, "Filter by label") + cmd.RegisterFlagCompletionFunc("label", completeLabel(env)) flags.StringSliceVarP(&options.titleQuery, "title", "t", nil, "Filter by title") flags.StringSliceVarP(&options.noQuery, "no", "n", nil, "Filter by absence of something. Valid values are [label]") + cmd.RegisterFlagCompletionFunc("no", completeLabel(env)) flags.StringVarP(&options.sortBy, "by", "b", "creation", "Sort the results by a characteristic. Valid values are [id,creation,edit]") + cmd.RegisterFlagCompletionFunc("by", completeFrom([]string{"id", "creation", "edit"})) flags.StringVarP(&options.sortDirection, "direction", "d", "asc", "Select the sorting direction. Valid values are [asc,desc]") + cmd.RegisterFlagCompletionFunc("direction", completeFrom([]string{"asc", "desc"})) flags.StringVarP(&options.outputFormat, "format", "f", "default", "Select the output formatting style. Valid values are [default,plain,json,org-mode]") + cmd.RegisterFlagCompletionFunc("format", + completeFrom([]string{"default", "plain", "json", "org-mode"})) return cmd } @@ -92,13 +103,9 @@ func runLs(env *Env, opts lsOptions, args []string) error { var err error if len(args) >= 1 { - // either the shell or cobra remove the quotes, we need them back for the parsing - for i, arg := range args { - if strings.Contains(arg, " ") { - args[i] = fmt.Sprintf("\"%s\"", arg) - } - } - assembled := strings.Join(args, " ") + // either the shell or cobra remove the quotes, we need them back for the query parsing + assembled := repairQuery(args) + q, err = query.Parse(assembled) if err != nil { return err @@ -142,6 +149,19 @@ func runLs(env *Env, opts lsOptions, args []string) error { } } +func repairQuery(args []string) string { + for i, arg := range args { + split := strings.Split(arg, ":") + for j, s := range split { + if strings.Contains(s, " ") { + split[j] = fmt.Sprintf("\"%s\"", s) + } + } + args[i] = strings.Join(split, ":") + } + return strings.Join(args, " ") +} + type JSONBugExcerpt struct { Id string `json:"id"` HumanId string `json:"human_id"` diff --git a/commands/ls_test.go b/commands/ls_test.go new file mode 100644 index 00000000..aff94e03 --- /dev/null +++ b/commands/ls_test.go @@ -0,0 +1,43 @@ +package commands + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func Test_repairQuery(t *testing.T) { + cases := []struct { + args []string + output string + }{ + { + []string{""}, + "", + }, + { + []string{"foo"}, + "foo", + }, + { + []string{"foo", "bar"}, + "foo bar", + }, + { + []string{"foo bar", "baz"}, + "\"foo bar\" baz", + }, + { + []string{"foo:bar", "baz"}, + "foo:bar baz", + }, + { + []string{"foo:bar boo", "baz"}, + "foo:\"bar boo\" baz", + }, + } + + for _, tc := range cases { + require.Equal(t, tc.output, repairQuery(tc.args)) + } +} diff --git a/commands/pull.go b/commands/pull.go index f3a31414..29c9f034 100644 --- a/commands/pull.go +++ b/commands/pull.go @@ -18,6 +18,7 @@ func newPullCommand() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runPull(env, args) }), + ValidArgsFunction: completeGitRemote(env), } return cmd diff --git a/commands/push.go b/commands/push.go index 9d6ca7df..adba6bef 100644 --- a/commands/push.go +++ b/commands/push.go @@ -16,6 +16,7 @@ func newPushCommand() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runPush(env, args) }), + ValidArgsFunction: completeGitRemote(env), } return cmd diff --git a/commands/rm.go b/commands/rm.go index 8205c128..2e1d924d 100644 --- a/commands/rm.go +++ b/commands/rm.go @@ -17,6 +17,7 @@ func newRmCommand() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runRm(env, args) }), + ValidArgsFunction: completeBug(env), } flags := cmd.Flags() diff --git a/commands/root.go b/commands/root.go index e7848363..e012bd83 100644 --- a/commands/root.go +++ b/commands/root.go @@ -50,14 +50,6 @@ the same git remote you are already using to collaborate with other people. SilenceUsage: true, DisableAutoGenTag: true, - - // Custom bash code to connect the git completion for "git bug" to the - // git-bug completion for "git-bug" - BashCompletionFunction: ` -_git_bug() { - __start_git-bug "$@" -} -`, } cmd.AddCommand(newAddCommand()) diff --git a/commands/select.go b/commands/select.go index 34d00a32..f9e6ece7 100644 --- a/commands/select.go +++ b/commands/select.go @@ -31,6 +31,7 @@ The complementary command is "git bug deselect" performing the opposite operatio RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runSelect(env, args) }), + ValidArgsFunction: completeBug(env), } return cmd diff --git a/commands/show.go b/commands/show.go index 55140357..16747214 100644 --- a/commands/show.go +++ b/commands/show.go @@ -29,13 +29,17 @@ func newShowCommand() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runShow(env, options, args) }), + ValidArgsFunction: completeBug(env), } flags := cmd.Flags() flags.SortFlags = false + fields := []string{"author", "authorEmail", "createTime", "lastEdit", "humanId", + "id", "labels", "shortId", "status", "title", "actors", "participants"} flags.StringVarP(&options.fields, "field", "", "", - "Select field to display. Valid values are [author,authorEmail,createTime,lastEdit,humanId,id,labels,shortId,status,title,actors,participants]") + "Select field to display. Valid values are ["+strings.Join(fields, ",")+"]") + cmd.RegisterFlagCompletionFunc("by", completeFrom(fields)) flags.StringVarP(&options.format, "format", "f", "default", "Select the output formatting style. Valid values are [default,json,org-mode]") diff --git a/commands/status.go b/commands/status.go index c1e45c5f..c3e860b6 100644 --- a/commands/status.go +++ b/commands/status.go @@ -15,6 +15,7 @@ func newStatusCommand() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runStatus(env, args) }), + ValidArgsFunction: completeBug(env), } cmd.AddCommand(newStatusCloseCommand()) diff --git a/commands/title.go b/commands/title.go index c4293530..f99c6eff 100644 --- a/commands/title.go +++ b/commands/title.go @@ -15,6 +15,7 @@ func newTitleCommand() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runTitle(env, args) }), + ValidArgsFunction: completeBug(env), } cmd.AddCommand(newTitleEditCommand()) diff --git a/commands/title_edit.go b/commands/title_edit.go index 810c5e62..a9e7fe4b 100644 --- a/commands/title_edit.go +++ b/commands/title_edit.go @@ -24,6 +24,7 @@ func newTitleEditCommand() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runTitleEdit(env, options, args) }), + ValidArgsFunction: completeBug(env), } flags := cmd.Flags() diff --git a/commands/user.go b/commands/user.go index b6a2e485..0fe3be4d 100644 --- a/commands/user.go +++ b/commands/user.go @@ -3,6 +3,7 @@ package commands import ( "errors" "fmt" + "strings" "github.com/spf13/cobra" @@ -24,6 +25,7 @@ func newUserCommand() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runUser(env, options, args) }), + ValidArgsFunction: completeUser(env), } cmd.AddCommand(newUserAdoptCommand()) @@ -33,8 +35,10 @@ func newUserCommand() *cobra.Command { flags := cmd.Flags() flags.SortFlags = false + fields := []string{"email", "humanId", "id", "lastModification", "lastModificationLamports", "login", "metadata", "name"} flags.StringVarP(&options.fields, "field", "f", "", - "Select field to display. Valid values are [email,humanId,id,lastModification,lastModificationLamports,login,metadata,name]") + "Select field to display. Valid values are ["+strings.Join(fields, ",")+"]") + cmd.RegisterFlagCompletionFunc("field", completeFrom(fields)) return cmd } diff --git a/commands/user_adopt.go b/commands/user_adopt.go index 166063ae..afef94ea 100644 --- a/commands/user_adopt.go +++ b/commands/user_adopt.go @@ -15,6 +15,7 @@ func newUserAdoptCommand() *cobra.Command { RunE: closeBackend(env, func(cmd *cobra.Command, args []string) error { return runUserAdopt(env, args) }), + ValidArgsFunction: completeUser(env), } return cmd diff --git a/commands/user_ls.go b/commands/user_ls.go index 98800b87..341f0dc1 100644 --- a/commands/user_ls.go +++ b/commands/user_ls.go @@ -32,6 +32,7 @@ func newUserLsCommand() *cobra.Command { flags.StringVarP(&options.format, "format", "f", "default", "Select the output formatting style. Valid values are [default,json]") + cmd.RegisterFlagCompletionFunc("format", completeFrom([]string{"default", "json"})) return cmd } |