From 19a639ab30edea3ba733210b7381a51b07c26fc9 Mon Sep 17 00:00:00 2001 From: Jerome Quere Date: Tue, 15 Sep 2020 12:59:21 +0200 Subject: [PATCH 1/2] refactor(core): add a filter to get deprecated ArgSpec --- internal/core/arg_specs.go | 10 ++++++++++ internal/core/autocomplete.go | 8 ++------ internal/core/cobra_usage_builder.go | 7 +------ internal/core/cobra_utils.go | 7 +++---- internal/core/validate.go | 9 ++++----- 5 files changed, 20 insertions(+), 21 deletions(-) diff --git a/internal/core/arg_specs.go b/internal/core/arg_specs.go index 733be74058..680e0cb977 100644 --- a/internal/core/arg_specs.go +++ b/internal/core/arg_specs.go @@ -24,6 +24,16 @@ func (s ArgSpecs) GetPositionalArg() *ArgSpec { return positionalArg } +func (s ArgSpecs) GetDeprecated(deprecated bool) ArgSpecs { + result := ArgSpecs{} + for _, argSpec := range s { + if argSpec.Deprecated == deprecated { + result = append(result, argSpec) + } + } + return result +} + func (s ArgSpecs) GetByName(name string) *ArgSpec { for _, spec := range s { if spec.Name == name { diff --git a/internal/core/autocomplete.go b/internal/core/autocomplete.go index c312501147..034863d62a 100644 --- a/internal/core/autocomplete.go +++ b/internal/core/autocomplete.go @@ -216,12 +216,8 @@ func BuildAutoCompleteTree(commands *Commands) *AutoCompleteNode { node.Command = cmd // We consider ArgSpecs as leaf in the autocomplete tree. - for _, argSpec := range cmd.ArgSpecs { - if argSpec.Deprecated { - // Do not autocomplete deprecated arguments. - continue - } - + nonDeprecatedArgs := cmd.ArgSpecs.GetDeprecated(false) + for _, argSpec := range nonDeprecatedArgs { if argSpec.Positional { node.Children[positionalValueNodeID] = NewAutoCompleteArgNode(cmd, argSpec) continue diff --git a/internal/core/cobra_usage_builder.go b/internal/core/cobra_usage_builder.go index 2a788d41ba..302f4ea098 100644 --- a/internal/core/cobra_usage_builder.go +++ b/internal/core/cobra_usage_builder.go @@ -25,12 +25,7 @@ func buildUsageArgs(ctx context.Context, cmd *Command, deprecated bool) string { tw := tabwriter.NewWriter(&argsBuffer, 0, 0, 3, ' ', 0) // Filter deprecated argSpecs. - argSpecs := ArgSpecs(nil) - for _, argSpec := range cmd.ArgSpecs { - if argSpec.Deprecated == deprecated { - argSpecs = append(argSpecs, argSpec) - } - } + argSpecs := cmd.ArgSpecs.GetDeprecated(deprecated) err := _buildUsageArgs(ctx, tw, argSpecs) if err != nil { diff --git a/internal/core/cobra_utils.go b/internal/core/cobra_utils.go index 60b5c7e7f4..0231da18f9 100644 --- a/internal/core/cobra_utils.go +++ b/internal/core/cobra_utils.go @@ -202,10 +202,9 @@ Relative time error: %s case *args.UnknownArgError, *args.InvalidArgNameError: argNames := []string(nil) - for _, argSpec := range cmd.ArgSpecs { - if !argSpec.Deprecated { - argNames = append(argNames, argSpec.Name) - } + nonDeprecatedArgs := cmd.ArgSpecs.GetDeprecated(false) + for _, argSpec := range nonDeprecatedArgs { + argNames = append(argNames, argSpec.Name) } return &CliError{ diff --git a/internal/core/validate.go b/internal/core/validate.go index bd11c8ea3b..74c2e7a29c 100644 --- a/internal/core/validate.go +++ b/internal/core/validate.go @@ -114,11 +114,10 @@ func validateNoConflict(cmd *Command, rawArgs args.RawArgs) error { // validateDeprecated print a warning message if a deprecated argument is used func validateDeprecated(ctx context.Context, cmd *Command) { - for _, argSpec := range cmd.ArgSpecs { - if argSpec.Deprecated { - helpCmd := cmd.GetCommandLine(extractMeta(ctx).BinaryName) + " --help" - ExtractLogger(ctx).Warningf("The argument '%s' is deprecated, more info with: %s\n", argSpec.Name, helpCmd) - } + deprecatedArgs := cmd.ArgSpecs.GetDeprecated(true) + for _, argSpec := range deprecatedArgs { + helpCmd := cmd.GetCommandLine(extractMeta(ctx).BinaryName) + " --help" + ExtractLogger(ctx).Warningf("The argument '%s' is deprecated, more info with: %s\n", argSpec.Name, helpCmd) } } From c1992f46a96997ae242e9fffafec4dd0dd06675c Mon Sep 17 00:00:00 2001 From: Jerome Quere Date: Tue, 15 Sep 2020 13:20:40 +0200 Subject: [PATCH 2/2] Update internal/core/arg_specs.go Co-authored-by: Quentin Brosse --- internal/core/arg_specs.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/core/arg_specs.go b/internal/core/arg_specs.go index 680e0cb977..6d8c558209 100644 --- a/internal/core/arg_specs.go +++ b/internal/core/arg_specs.go @@ -24,6 +24,7 @@ func (s ArgSpecs) GetPositionalArg() *ArgSpec { return positionalArg } +// GetDeprecated gets all fields filtered by the deprecation state. func (s ArgSpecs) GetDeprecated(deprecated bool) ArgSpecs { result := ArgSpecs{} for _, argSpec := range s {