This replaces the visitAll recursive function with a test that verifies that the option is set for all commands and subcommands, so that it doesn't have to be modified at runtime. We currently still have to loop over all functions for the setValidateArgs call, but that can be looked at separately. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
86 lines
2.4 KiB
Go
86 lines
2.4 KiB
Go
package image
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/containerd/platforms"
|
|
"github.com/docker/cli/cli"
|
|
"github.com/docker/cli/cli/command"
|
|
"github.com/docker/cli/cli/command/completion"
|
|
"github.com/docker/cli/cli/command/formatter"
|
|
flagsHelper "github.com/docker/cli/cli/flags"
|
|
"github.com/moby/moby/client"
|
|
"github.com/pkg/errors"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
type historyOptions struct {
|
|
image string
|
|
platform string
|
|
|
|
human bool
|
|
quiet bool
|
|
noTrunc bool
|
|
format string
|
|
}
|
|
|
|
// newHistoryCommand creates a new "docker image history" command.
|
|
func newHistoryCommand(dockerCLI command.Cli) *cobra.Command {
|
|
var opts historyOptions
|
|
|
|
cmd := &cobra.Command{
|
|
Use: "history [OPTIONS] IMAGE",
|
|
Short: "Show the history of an image",
|
|
Args: cli.ExactArgs(1),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
opts.image = args[0]
|
|
return runHistory(cmd.Context(), dockerCLI, opts)
|
|
},
|
|
ValidArgsFunction: completion.ImageNames(dockerCLI, 1),
|
|
Annotations: map[string]string{
|
|
"aliases": "docker image history, docker history",
|
|
},
|
|
DisableFlagsInUseLine: true,
|
|
}
|
|
|
|
flags := cmd.Flags()
|
|
|
|
flags.BoolVarP(&opts.human, "human", "H", true, "Print sizes and dates in human readable format")
|
|
flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Only show image IDs")
|
|
flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Don't truncate output")
|
|
flags.StringVar(&opts.format, "format", "", flagsHelper.FormatHelp)
|
|
flags.StringVar(&opts.platform, "platform", "", `Show history for the given platform. Formatted as "os[/arch[/variant]]" (e.g., "linux/amd64")`)
|
|
_ = flags.SetAnnotation("platform", "version", []string{"1.48"})
|
|
|
|
_ = cmd.RegisterFlagCompletionFunc("platform", completion.Platforms)
|
|
return cmd
|
|
}
|
|
|
|
func runHistory(ctx context.Context, dockerCli command.Cli, opts historyOptions) error {
|
|
var options []client.ImageHistoryOption
|
|
if opts.platform != "" {
|
|
p, err := platforms.Parse(opts.platform)
|
|
if err != nil {
|
|
return errors.Wrap(err, "invalid platform")
|
|
}
|
|
options = append(options, client.ImageHistoryWithPlatform(p))
|
|
}
|
|
|
|
history, err := dockerCli.Client().ImageHistory(ctx, opts.image, options...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
format := opts.format
|
|
if len(format) == 0 {
|
|
format = formatter.TableFormatKey
|
|
}
|
|
|
|
historyCtx := formatter.Context{
|
|
Output: dockerCli.Out(),
|
|
Format: newHistoryFormat(format, opts.quiet, opts.human),
|
|
Trunc: !opts.noTrunc,
|
|
}
|
|
return historyWrite(historyCtx, opts.human, history)
|
|
}
|