From f67f1aa505823af89314abc71d8573425871d366 Mon Sep 17 00:00:00 2001 From: Dean Chen <862469039@qq.com> Date: Sun, 30 Aug 2026 18:03:51 +0500 Subject: [PATCH] commands: complete --platform values for build docker buildx build --platform previously completed nothing, while docker build offers a short platform list. Wire the same list onto the buildx flag. Signed-off-by: Dean Chen <862469039@qq.com> --- commands/build.go | 2 ++ util/cobrautil/completion/completion.go | 22 ++++++++++++++++ util/cobrautil/completion/completion_test.go | 27 ++++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 util/cobrautil/completion/completion_test.go diff --git a/commands/build.go b/commands/build.go index 5f267704052a..a5a7080276ea 100644 --- a/commands/build.go +++ b/commands/build.go @@ -26,6 +26,7 @@ import ( "github.com/docker/buildx/store/storeutil" "github.com/docker/buildx/util/buildflags" "github.com/docker/buildx/util/cobrautil" + "github.com/docker/buildx/util/cobrautil/completion" "github.com/docker/buildx/util/confutil" "github.com/docker/buildx/util/desktop" "github.com/docker/buildx/util/dockerutil" @@ -585,6 +586,7 @@ func buildCmd(dockerCli command.Cli, rootOpts *rootOptions, debugger debuggerOpt flags.StringArrayVarP(&options.outputs, "output", "o", []string{}, `Output destination (format: "type=local,dest=path")`) flags.StringArrayVar(&options.platforms, "platform", platformsDefault, "Set target platform for build") + cmd.RegisterFlagCompletionFunc("platform", completion.Platforms()) //nolint:errcheck flags.StringArrayVar(&options.policy, "policy", []string{}, `Policy configuration (format: "filename=path[,filename=path][,reset=true|false][,disabled=true|false][,strict=true|false][,log-level=level]")`) diff --git a/util/cobrautil/completion/completion.go b/util/cobrautil/completion/completion.go index 095cac521090..a9d36bdafdb5 100644 --- a/util/cobrautil/completion/completion.go +++ b/util/cobrautil/completion/completion.go @@ -60,3 +60,25 @@ func BuilderNames(dockerCli command.Cli) ValidArgsFn { return filtered, cobra.ShellCompDirectiveNoFileComp } } + +var commonPlatforms = []string{ + "linux/386", + "linux/amd64", + "linux/arm", + "linux/arm/v5", + "linux/arm/v6", + "linux/arm/v7", + "linux/arm64", + "linux/arm64/v8", + "linux/ppc64le", + "linux/s390x", + "linux/riscv64", + "windows/amd64", + "wasip1/wasm", +} + +func Platforms() ValidArgsFn { + return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + return commonPlatforms, cobra.ShellCompDirectiveNoFileComp + } +} diff --git a/util/cobrautil/completion/completion_test.go b/util/cobrautil/completion/completion_test.go new file mode 100644 index 000000000000..46a7b4e2f872 --- /dev/null +++ b/util/cobrautil/completion/completion_test.go @@ -0,0 +1,27 @@ +package completion + +import ( + "testing" + + "github.com/spf13/cobra" +) + +func TestPlatforms(t *testing.T) { + values, directive := Platforms()(nil, nil, "") + if directive != cobra.ShellCompDirectiveNoFileComp { + t.Fatalf("directive = %v, want NoFileComp", directive) + } + if len(values) == 0 { + t.Fatal("expected platform completions") + } + want := map[string]bool{"linux/amd64": true, "linux/arm64": true, "windows/amd64": true} + got := map[string]bool{} + for _, v := range values { + got[v] = true + } + for p := range want { + if !got[p] { + t.Errorf("missing platform %q in %v", p, values) + } + } +}