From a656dfd409709ccede09540b9a247781566f53ad Mon Sep 17 00:00:00 2001 From: Mohammed Aminu Futa Date: Tue, 11 Feb 2025 12:55:22 +0000 Subject: [PATCH] Restrict completion for some commands with a limit paramter for ImageNames Previously, multiple suggestions were provided when completing commands like `run`, `history` and `push`. This change limits completion to a single suggestion for the above and 2 suggestions for `tag` Signed-off-by: Mohammed Aminu Futa --- cli/command/completion/functions.go | 5 ++++- cli/command/completion/functions_test.go | 2 +- cli/command/container/create.go | 2 +- cli/command/container/run.go | 2 +- cli/command/image/history.go | 2 +- cli/command/image/inspect.go | 2 +- cli/command/image/push.go | 2 +- cli/command/image/remove.go | 2 +- cli/command/image/save.go | 2 +- cli/command/image/tag.go | 2 +- 10 files changed, 13 insertions(+), 10 deletions(-) diff --git a/cli/command/completion/functions.go b/cli/command/completion/functions.go index deda08e7ba92..ddb84422118e 100644 --- a/cli/command/completion/functions.go +++ b/cli/command/completion/functions.go @@ -27,8 +27,11 @@ type APIClientProvider interface { } // ImageNames offers completion for images present within the local store -func ImageNames(dockerCLI APIClientProvider) ValidArgsFn { +func ImageNames(dockerCLI APIClientProvider, limit int) ValidArgsFn { return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + if limit > 0 && len(args) >= limit { + return nil, cobra.ShellCompDirectiveNoFileComp + } list, err := dockerCLI.Client().ImageList(cmd.Context(), image.ListOptions{}) if err != nil { return nil, cobra.ShellCompDirectiveError diff --git a/cli/command/completion/functions_test.go b/cli/command/completion/functions_test.go index 9357a26accf2..077a2f066213 100644 --- a/cli/command/completion/functions_test.go +++ b/cli/command/completion/functions_test.go @@ -234,7 +234,7 @@ func TestCompleteImageNames(t *testing.T) { } return tc.images, nil }, - }}) + }}, -1) volumes, directives := comp(&cobra.Command{}, nil, "") assert.Check(t, is.Equal(directives&tc.expDirective, tc.expDirective)) diff --git a/cli/command/container/create.go b/cli/command/container/create.go index 30aea832ce81..42dab1898366 100644 --- a/cli/command/container/create.go +++ b/cli/command/container/create.go @@ -60,7 +60,7 @@ func NewCreateCommand(dockerCli command.Cli) *cobra.Command { Annotations: map[string]string{ "aliases": "docker container create, docker create", }, - ValidArgsFunction: completion.ImageNames(dockerCli), + ValidArgsFunction: completion.ImageNames(dockerCli, -1), } flags := cmd.Flags() diff --git a/cli/command/container/run.go b/cli/command/container/run.go index ac780533bfd3..d824d8b17e70 100644 --- a/cli/command/container/run.go +++ b/cli/command/container/run.go @@ -43,7 +43,7 @@ func NewRunCommand(dockerCli command.Cli) *cobra.Command { } return runRun(cmd.Context(), dockerCli, cmd.Flags(), &options, copts) }, - ValidArgsFunction: completion.ImageNames(dockerCli), + ValidArgsFunction: completion.ImageNames(dockerCli, 1), Annotations: map[string]string{ "category-top": "1", "aliases": "docker container run, docker run", diff --git a/cli/command/image/history.go b/cli/command/image/history.go index 91a09e6be78b..43b52e8f7ae3 100644 --- a/cli/command/image/history.go +++ b/cli/command/image/history.go @@ -36,7 +36,7 @@ func NewHistoryCommand(dockerCli command.Cli) *cobra.Command { opts.image = args[0] return runHistory(cmd.Context(), dockerCli, opts) }, - ValidArgsFunction: completion.ImageNames(dockerCli), + ValidArgsFunction: completion.ImageNames(dockerCli, 1), Annotations: map[string]string{ "aliases": "docker image history, docker history", }, diff --git a/cli/command/image/inspect.go b/cli/command/image/inspect.go index f66213a9a449..ece81cae719a 100644 --- a/cli/command/image/inspect.go +++ b/cli/command/image/inspect.go @@ -34,7 +34,7 @@ func newInspectCommand(dockerCli command.Cli) *cobra.Command { opts.refs = args return runInspect(cmd.Context(), dockerCli, opts) }, - ValidArgsFunction: completion.ImageNames(dockerCli), + ValidArgsFunction: completion.ImageNames(dockerCli, -1), } flags := cmd.Flags() diff --git a/cli/command/image/push.go b/cli/command/image/push.go index fd4a690f1bd6..19e5c8a8f645 100644 --- a/cli/command/image/push.go +++ b/cli/command/image/push.go @@ -51,7 +51,7 @@ func NewPushCommand(dockerCli command.Cli) *cobra.Command { "category-top": "6", "aliases": "docker image push, docker push", }, - ValidArgsFunction: completion.ImageNames(dockerCli), + ValidArgsFunction: completion.ImageNames(dockerCli, 1), } flags := cmd.Flags() diff --git a/cli/command/image/remove.go b/cli/command/image/remove.go index 4a17bfcdb0c6..577772cbcb4c 100644 --- a/cli/command/image/remove.go +++ b/cli/command/image/remove.go @@ -29,7 +29,7 @@ func NewRemoveCommand(dockerCli command.Cli) *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { return runRemove(cmd.Context(), dockerCli, opts, args) }, - ValidArgsFunction: completion.ImageNames(dockerCli), + ValidArgsFunction: completion.ImageNames(dockerCli, -1), Annotations: map[string]string{ "aliases": "docker image rm, docker image remove, docker rmi", }, diff --git a/cli/command/image/save.go b/cli/command/image/save.go index 802b57b51e7c..2f49d9c8bf4a 100644 --- a/cli/command/image/save.go +++ b/cli/command/image/save.go @@ -34,7 +34,7 @@ func NewSaveCommand(dockerCli command.Cli) *cobra.Command { Annotations: map[string]string{ "aliases": "docker image save, docker save", }, - ValidArgsFunction: completion.ImageNames(dockerCli), + ValidArgsFunction: completion.ImageNames(dockerCli, -1), } flags := cmd.Flags() diff --git a/cli/command/image/tag.go b/cli/command/image/tag.go index 29da7f37533e..7a495afca044 100644 --- a/cli/command/image/tag.go +++ b/cli/command/image/tag.go @@ -30,7 +30,7 @@ func NewTagCommand(dockerCli command.Cli) *cobra.Command { Annotations: map[string]string{ "aliases": "docker image tag, docker tag", }, - ValidArgsFunction: completion.ImageNames(dockerCli), + ValidArgsFunction: completion.ImageNames(dockerCli, 2), } flags := cmd.Flags()