commands: verify that DisableFlagsInUseLine is set for all commands

This replaces the DisableFlagsInUseLine call from the CLI with a test
that verifies the option is set for all commands and subcommands, so
that it doesn't have to be modified at runtime.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn 2025-08-28 17:54:06 +02:00
parent bb41e835b6
commit 07b99ae7bf
No known key found for this signature in database
GPG Key ID: 76698F39D527CE8C
31 changed files with 96 additions and 31 deletions

View File

@ -493,6 +493,7 @@ func bakeCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
return runBake(cmd.Context(), dockerCli, args, options, cFlags, filesFromEnv) return runBake(cmd.Context(), dockerCli, args, options, cFlags, filesFromEnv)
}, },
ValidArgsFunction: completion.BakeTargets(options.files), ValidArgsFunction: completion.BakeTargets(options.files),
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -490,6 +490,7 @@ func buildCmd(dockerCli command.Cli, rootOpts *rootOptions, debugger debuggerOpt
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return nil, cobra.ShellCompDirectiveFilterDirs return nil, cobra.ShellCompDirectiveFilterDirs
}, },
DisableFlagsInUseLine: true,
} }
var platformsDefault []string var platformsDefault []string

View File

@ -99,6 +99,7 @@ func createCmd(dockerCli command.Cli) *cobra.Command {
return runCreate(cmd.Context(), dockerCli, options, args) return runCreate(cmd.Context(), dockerCli, options, args)
}, },
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -23,6 +23,8 @@ func dapCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "dap", Use: "dap",
Short: "Start debug adapter protocol compatible debugger", Short: "Start debug adapter protocol compatible debugger",
DisableFlagsInUseLine: true,
} }
cobrautil.MarkCommandExperimental(cmd) cobrautil.MarkCommandExperimental(cmd)
@ -116,6 +118,7 @@ func dapAttachCmd() *cobra.Command {
} }
return nil return nil
}, },
DisableFlagsInUseLine: true,
} }
return cmd return cmd
} }

View File

@ -44,6 +44,8 @@ func debugCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "debug", Use: "debug",
Short: "Start debugger", Short: "Start debugger",
DisableFlagsInUseLine: true,
} }
cobrautil.MarkCommandExperimental(cmd) cobrautil.MarkCommandExperimental(cmd)

View File

@ -122,6 +122,7 @@ func dialStdioCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
opts.builder = rootOpts.builder opts.builder = rootOpts.builder
return runDialStdio(dockerCli, opts) return runDialStdio(dockerCli, opts)
}, },
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -190,6 +190,7 @@ func duCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
return runDiskUsage(cmd.Context(), dockerCli, options) return runDiskUsage(cmd.Context(), dockerCli, options)
}, },
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -161,6 +161,7 @@ func exportCmd(dockerCli command.Cli, rootOpts RootOptions) *cobra.Command {
return runExport(cmd.Context(), dockerCli, options) return runExport(cmd.Context(), dockerCli, options)
}, },
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -126,6 +126,7 @@ func importCmd(dockerCli command.Cli, _ RootOptions) *cobra.Command {
return runImport(cmd.Context(), dockerCli, options) return runImport(cmd.Context(), dockerCli, options)
}, },
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -657,6 +657,7 @@ func inspectCmd(dockerCli command.Cli, rootOpts RootOptions) *cobra.Command {
return runInspect(cmd.Context(), dockerCli, options) return runInspect(cmd.Context(), dockerCli, options)
}, },
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
cmd.AddCommand( cmd.AddCommand(

View File

@ -130,6 +130,7 @@ func attachmentCmd(dockerCli command.Cli, rootOpts RootOptions) *cobra.Command {
return runAttachment(cmd.Context(), dockerCli, options) return runAttachment(cmd.Context(), dockerCli, options)
}, },
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -97,6 +97,7 @@ func logsCmd(dockerCli command.Cli, rootOpts RootOptions) *cobra.Command {
return runLogs(cmd.Context(), dockerCli, options) return runLogs(cmd.Context(), dockerCli, options)
}, },
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -104,6 +104,7 @@ func lsCmd(dockerCli command.Cli, rootOpts RootOptions) *cobra.Command {
return runLs(cmd.Context(), dockerCli, options) return runLs(cmd.Context(), dockerCli, options)
}, },
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -56,6 +56,7 @@ func openCmd(dockerCli command.Cli, rootOpts RootOptions) *cobra.Command {
return runOpen(cmd.Context(), dockerCli, options) return runOpen(cmd.Context(), dockerCli, options)
}, },
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
return cmd return cmd

View File

@ -130,6 +130,7 @@ func rmCmd(dockerCli command.Cli, rootOpts RootOptions) *cobra.Command {
return runRm(cmd.Context(), dockerCli, options) return runRm(cmd.Context(), dockerCli, options)
}, },
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -16,6 +16,8 @@ func RootCmd(rootcmd *cobra.Command, dockerCli command.Cli, opts RootOptions) *c
Short: "Commands to work on build records", Short: "Commands to work on build records",
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
RunE: rootcmd.RunE, RunE: rootcmd.RunE,
DisableFlagsInUseLine: true,
} }
cmd.AddCommand( cmd.AddCommand(

View File

@ -200,6 +200,7 @@ func traceCmd(dockerCli command.Cli, rootOpts RootOptions) *cobra.Command {
return runTrace(cmd.Context(), dockerCli, options) return runTrace(cmd.Context(), dockerCli, options)
}, },
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -280,6 +280,7 @@ func createCmd(dockerCli command.Cli, opts RootOptions) *cobra.Command {
return runCreate(cmd.Context(), dockerCli, options, args) return runCreate(cmd.Context(), dockerCli, options, args)
}, },
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -53,6 +53,7 @@ func inspectCmd(dockerCli command.Cli, rootOpts RootOptions) *cobra.Command {
return runInspect(cmd.Context(), dockerCli, options, args[0]) return runInspect(cmd.Context(), dockerCli, options, args[0])
}, },
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -16,6 +16,7 @@ func RootCmd(rootcmd *cobra.Command, dockerCli command.Cli, opts RootOptions) *c
Short: "Commands to work on images in registry", Short: "Commands to work on images in registry",
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
RunE: rootcmd.RunE, RunE: rootcmd.RunE,
DisableFlagsInUseLine: true,
} }
cmd.AddCommand( cmd.AddCommand(

View File

@ -183,6 +183,7 @@ func inspectCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
return runInspect(cmd.Context(), dockerCli, options) return runInspect(cmd.Context(), dockerCli, options)
}, },
ValidArgsFunction: completion.BuilderNames(dockerCli), ValidArgsFunction: completion.BuilderNames(dockerCli),
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -49,6 +49,7 @@ func installCmd(dockerCli command.Cli) *cobra.Command {
}, },
Hidden: true, Hidden: true,
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
// hide builder persistent flag for this command // hide builder persistent flag for this command

View File

@ -108,6 +108,7 @@ func lsCmd(dockerCli command.Cli) *cobra.Command {
return runLs(cmd.Context(), dockerCli, options) return runLs(cmd.Context(), dockerCli, options)
}, },
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -171,6 +171,7 @@ func pruneCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
return runPrune(cmd.Context(), dockerCli, options) return runPrune(cmd.Context(), dockerCli, options)
}, },
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -112,6 +112,7 @@ func rmCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
return runRm(cmd.Context(), dockerCli, options) return runRm(cmd.Context(), dockerCli, options)
}, },
ValidArgsFunction: completion.BuilderNames(dockerCli), ValidArgsFunction: completion.BuilderNames(dockerCli),
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -71,6 +71,7 @@ func NewRootCmd(name string, isPlugin bool, dockerCli *command.DockerCli) *cobra
Status: fmt.Sprintf("ERROR: unknown command: %q", args[0]), Status: fmt.Sprintf("ERROR: unknown command: %q", args[0]),
} }
}, },
DisableFlagsInUseLine: true,
} }
if !isPlugin { if !isPlugin {
// match plugin behavior for standalone mode // match plugin behavior for standalone mode
@ -78,8 +79,6 @@ func NewRootCmd(name string, isPlugin bool, dockerCli *command.DockerCli) *cobra
cmd.SilenceUsage = true cmd.SilenceUsage = true
cmd.SilenceErrors = true cmd.SilenceErrors = true
cmd.TraverseChildren = true cmd.TraverseChildren = true
cmd.DisableFlagsInUseLine = true
cli.DisableFlagsInUseLine(cmd)
if !confutil.IsExperimental() { if !confutil.IsExperimental() {
cmd.SetHelpTemplate(cmd.HelpTemplate() + "\n" + experimentalCommandHint + "\n") cmd.SetHelpTemplate(cmd.HelpTemplate() + "\n" + experimentalCommandHint + "\n")
} }

33
commands/root_test.go Normal file
View File

@ -0,0 +1,33 @@
package commands
import (
stderrs "errors"
"testing"
"github.com/docker/cli/cli/command"
"github.com/pkg/errors"
"github.com/spf13/cobra"
"github.com/stretchr/testify/require"
)
func TestDisableFlagsInUseLineIsSet(t *testing.T) {
cmd, err := command.NewDockerCli()
require.NoError(t, err)
rootCmd := NewRootCmd("buildx", true, cmd)
var errs []error
visitAll(rootCmd, func(c *cobra.Command) {
if !c.DisableFlagsInUseLine {
errs = append(errs, errors.New("DisableFlagsInUseLine is not set for "+c.CommandPath()))
}
})
err = stderrs.Join(errs...)
require.NoError(t, err)
}
func visitAll(root *cobra.Command, fn func(*cobra.Command)) {
for _, cmd := range root.Commands() {
visitAll(cmd, fn)
}
fn(root)
}

View File

@ -45,6 +45,7 @@ func stopCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
return runStop(cmd.Context(), dockerCli, options) return runStop(cmd.Context(), dockerCli, options)
}, },
ValidArgsFunction: completion.BuilderNames(dockerCli), ValidArgsFunction: completion.BuilderNames(dockerCli),
DisableFlagsInUseLine: true,
} }
return cmd return cmd

View File

@ -55,6 +55,7 @@ func uninstallCmd(dockerCli command.Cli) *cobra.Command {
}, },
Hidden: true, Hidden: true,
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
// hide builder persistent flag for this command // hide builder persistent flag for this command

View File

@ -72,6 +72,7 @@ func useCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
return runUse(dockerCli, options) return runUse(dockerCli, options)
}, },
ValidArgsFunction: completion.BuilderNames(dockerCli), ValidArgsFunction: completion.BuilderNames(dockerCli),
DisableFlagsInUseLine: true,
} }
flags := cmd.Flags() flags := cmd.Flags()

View File

@ -25,6 +25,7 @@ func versionCmd(dockerCli command.Cli) *cobra.Command {
return runVersion(dockerCli) return runVersion(dockerCli)
}, },
ValidArgsFunction: completion.Disable, ValidArgsFunction: completion.Disable,
DisableFlagsInUseLine: true,
} }
// hide builder persistent flag for this command // hide builder persistent flag for this command