From cc286e2ef51b4698819b92a566c7266ac1d3cd85 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Wed, 16 Oct 2024 16:15:26 +0200 Subject: [PATCH] cli: error out on unknown command Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- commands/imagetools/root.go | 3 ++- commands/root.go | 14 ++++++++++++-- tests/common.go | 29 +++++++++++++++++++++++++++++ tests/integration_test.go | 1 + 4 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 tests/common.go diff --git a/commands/imagetools/root.go b/commands/imagetools/root.go index f5ec0160..03acc799 100644 --- a/commands/imagetools/root.go +++ b/commands/imagetools/root.go @@ -10,11 +10,12 @@ type RootOptions struct { Builder *string } -func RootCmd(dockerCli command.Cli, opts RootOptions) *cobra.Command { +func RootCmd(rootcmd *cobra.Command, dockerCli command.Cli, opts RootOptions) *cobra.Command { cmd := &cobra.Command{ Use: "imagetools", Short: "Commands to work on images in registry", ValidArgsFunction: completion.Disable, + RunE: rootcmd.RunE, } cmd.AddCommand( diff --git a/commands/root.go b/commands/root.go index 360b40ab..bc828705 100644 --- a/commands/root.go +++ b/commands/root.go @@ -1,6 +1,7 @@ package commands import ( + "fmt" "os" debugcmd "github.com/docker/buildx/commands/debug" @@ -36,13 +37,22 @@ func NewRootCmd(name string, isPlugin bool, dockerCli command.Cli) *cobra.Comman if opt.debug { debug.Enable() } - cmd.SetContext(appcontext.Context()) if !isPlugin { return nil } return plugin.PersistentPreRunE(cmd, args) }, + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) == 0 { + return cmd.Help() + } + _ = cmd.Help() + return cli.StatusError{ + StatusCode: 1, + Status: fmt.Sprintf("ERROR: unknown command: %q", args[0]), + } + }, } if !isPlugin { // match plugin behavior for standalone mode @@ -95,7 +105,7 @@ func addCommands(cmd *cobra.Command, opts *rootOptions, dockerCli command.Cli) { versionCmd(dockerCli), pruneCmd(dockerCli, opts), duCmd(dockerCli, opts), - imagetoolscmd.RootCmd(dockerCli, imagetoolscmd.RootOptions{Builder: &opts.builder}), + imagetoolscmd.RootCmd(cmd, dockerCli, imagetoolscmd.RootOptions{Builder: &opts.builder}), ) if confutil.IsExperimental() { cmd.AddCommand(debugcmd.RootCmd(dockerCli, diff --git a/tests/common.go b/tests/common.go new file mode 100644 index 00000000..b2186c34 --- /dev/null +++ b/tests/common.go @@ -0,0 +1,29 @@ +package tests + +import ( + "testing" + + "github.com/moby/buildkit/util/testutil/integration" + "github.com/stretchr/testify/require" +) + +var commonTests = []func(t *testing.T, sb integration.Sandbox){ + testUnknownCommand, + testUnknownFlag, +} + +func testUnknownCommand(t *testing.T, sb integration.Sandbox) { + cmd := buildxCmd(sb, withArgs("foo")) + out, err := cmd.CombinedOutput() + require.Error(t, err, string(out)) + + cmd = buildxCmd(sb, withArgs("imagetools", "foo")) + out, err = cmd.CombinedOutput() + require.Error(t, err, string(out)) +} + +func testUnknownFlag(t *testing.T, sb integration.Sandbox) { + cmd := buildxCmd(sb, withArgs("build", "--foo=bar")) + out, err := cmd.CombinedOutput() + require.Error(t, err, string(out)) +} diff --git a/tests/integration_test.go b/tests/integration_test.go index a9d49ea7..9cd76c7c 100644 --- a/tests/integration_test.go +++ b/tests/integration_test.go @@ -21,6 +21,7 @@ func init() { func TestIntegration(t *testing.T) { var tests []func(t *testing.T, sb integration.Sandbox) + tests = append(tests, commonTests...) tests = append(tests, buildTests...) tests = append(tests, bakeTests...) tests = append(tests, inspectTests...)