From 787caf2fe40c52ae05481c6cc80410ba71c99b20 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Fri, 5 Jul 2024 14:57:19 +0200 Subject: [PATCH] cmd/docker: fix completion for --context registerCompletionFuncForGlobalFlags was called from newDockerCommand, at which time no context-store is initialized yet, so it would return a nil value, probably resulting in `store.Names` to panic, but these errors are not shown when running the completion. As a result, the flag completion would fall back to completing from filenames. This patch changes the function to dynamically get the context-store; this fixes the problem mentioned above, because at the time the completion function is _invoked_, the CLI is fully initialized, and does have a context-store available. A (non-exported) interface is defined to allow the function to accept alternative implementations (not requiring a full command.DockerCLI). Before this patch: docker context create one docker context create two docker --context .DS_Store .idea/ Makefile .dockerignore .mailmap build/ ... With this patch: docker context create one docker context create two docker --context default one two Signed-off-by: Sebastiaan van Stijn (cherry picked from commit 42b68a3ed72b0e6e8b26e48a15dd1b2a99f4b8bf) Signed-off-by: Sebastiaan van Stijn --- cmd/docker/completions.go | 20 +++++++++----------- cmd/docker/docker.go | 2 +- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/cmd/docker/completions.go b/cmd/docker/completions.go index afa87d7008..95ee737b42 100644 --- a/cmd/docker/completions.go +++ b/cmd/docker/completions.go @@ -6,17 +6,15 @@ import ( "github.com/spf13/cobra" ) -func registerCompletionFuncForGlobalFlags(contextStore store.Store, cmd *cobra.Command) error { - err := cmd.RegisterFlagCompletionFunc( - "context", - func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - names, err := store.Names(contextStore) - if err != nil { - return nil, cobra.ShellCompDirectiveError - } - return names, cobra.ShellCompDirectiveNoFileComp - }, - ) +type contextStoreProvider interface { + ContextStore() store.Store +} + +func registerCompletionFuncForGlobalFlags(dockerCLI contextStoreProvider, cmd *cobra.Command) error { + err := cmd.RegisterFlagCompletionFunc("context", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { + names, _ := store.Names(dockerCLI.ContextStore()) + return names, cobra.ShellCompDirectiveNoFileComp + }) if err != nil { return err } diff --git a/cmd/docker/docker.go b/cmd/docker/docker.go index 7825c7d354..6e28a99ebc 100644 --- a/cmd/docker/docker.go +++ b/cmd/docker/docker.go @@ -102,7 +102,7 @@ func newDockerCommand(dockerCli *command.DockerCli) *cli.TopLevelCommand { cmd.SetErr(dockerCli.Err()) opts, helpCmd = cli.SetupRootCommand(cmd) - _ = registerCompletionFuncForGlobalFlags(dockerCli.ContextStore(), cmd) + _ = registerCompletionFuncForGlobalFlags(dockerCli, cmd) cmd.Flags().BoolP("version", "v", false, "Print version information and quit") setFlagErrorFunc(dockerCli, cmd)