summaryrefslogtreecommitdiff
path: root/cmd/podman/diff.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/podman/diff.go')
-rw-r--r--cmd/podman/diff.go154
1 files changed, 37 insertions, 117 deletions
diff --git a/cmd/podman/diff.go b/cmd/podman/diff.go
index c15512360..8db76e8af 100644
--- a/cmd/podman/diff.go
+++ b/cmd/podman/diff.go
@@ -3,139 +3,59 @@ package main
import (
"fmt"
- "github.com/containers/buildah/pkg/formats"
- "github.com/containers/libpod/cmd/podman/cliconfig"
- "github.com/containers/libpod/pkg/adapter"
- "github.com/containers/storage/pkg/archive"
- "github.com/pkg/errors"
+ "github.com/containers/libpod/cmd/podman/containers"
+ "github.com/containers/libpod/cmd/podman/images"
+ "github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/pkg/domain/entities"
"github.com/spf13/cobra"
)
-type diffJSONOutput struct {
- Changed []string `json:"changed,omitempty"`
- Added []string `json:"added,omitempty"`
- Deleted []string `json:"deleted,omitempty"`
-}
-
-type diffOutputParams struct {
- Change archive.ChangeType
- Path string
-}
-
-type stdoutStruct struct {
- output []diffOutputParams
-}
-
-func (so stdoutStruct) Out() error {
- for _, d := range so.output {
- fmt.Printf("%s %s\n", d.Change, d.Path)
- }
- return nil
-}
+// Inspect is one of the outlier commands in that it operates on images/containers/...
var (
- diffCommand cliconfig.DiffValues
- diffDescription = fmt.Sprint(`Displays changes on a container or image's filesystem. The container or image will be compared to its parent layer.`)
-
- _diffCommand = &cobra.Command{
- Use: "diff [flags] CONTAINER | IMAGE",
- Short: "Inspect changes on container's file systems",
- Long: diffDescription,
- RunE: func(cmd *cobra.Command, args []string) error {
- diffCommand.InputArgs = args
- diffCommand.GlobalFlags = MainGlobalOpts
- diffCommand.Remote = remoteclient
- return diffCmd(&diffCommand)
- },
+ // Command: podman _diff_ Object_ID
+ diffDescription = `Displays changes on a container or image's filesystem. The container or image will be compared to its parent layer.`
+ diffCmd = &cobra.Command{
+ Use: "diff [flags] {CONTAINER_ID | IMAGE_ID}",
+ Args: registry.IdOrLatestArgs,
+ Short: "Display the changes of object's file system",
+ Long: diffDescription,
+ TraverseChildren: true,
+ RunE: diff,
Example: `podman diff imageID
podman diff ctrID
podman diff --format json redis:alpine`,
}
+
+ diffOpts = entities.DiffOptions{}
)
func init() {
- diffCommand.Command = _diffCommand
- diffCommand.SetHelpTemplate(HelpTemplate())
- diffCommand.SetUsageTemplate(UsageTemplate())
- flags := diffCommand.Flags()
-
- flags.BoolVar(&diffCommand.Archive, "archive", true, "Save the diff as a tar archive")
- flags.StringVar(&diffCommand.Format, "format", "", "Change the output format")
- flags.BoolVarP(&diffCommand.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
- markFlagHidden(flags, "archive")
- markFlagHiddenForRemoteClient("latest", flags)
-
-}
-
-func formatJSON(output []diffOutputParams) (diffJSONOutput, error) {
- jsonStruct := diffJSONOutput{}
- for _, output := range output {
- switch output.Change {
- case archive.ChangeModify:
- jsonStruct.Changed = append(jsonStruct.Changed, output.Path)
- case archive.ChangeAdd:
- jsonStruct.Added = append(jsonStruct.Added, output.Path)
- case archive.ChangeDelete:
- jsonStruct.Deleted = append(jsonStruct.Deleted, output.Path)
- default:
- return jsonStruct, errors.Errorf("output kind %q not recognized", output.Change.String())
- }
+ registry.Commands = append(registry.Commands, registry.CliCommand{
+ Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
+ Command: diffCmd,
+ })
+ flags := diffCmd.Flags()
+ flags.BoolVar(&diffOpts.Archive, "archive", true, "Save the diff as a tar archive")
+ _ = flags.MarkHidden("archive")
+ flags.StringVar(&diffOpts.Format, "format", "", "Change the output format")
+
+ if !registry.IsRemote() {
+ flags.BoolVarP(&diffOpts.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
}
- return jsonStruct, nil
}
-func diffCmd(c *cliconfig.DiffValues) error {
- if len(c.InputArgs) != 1 && !c.Latest {
- return errors.Errorf("container, image, or layer name must be specified: podman diff [options [...]] ID-NAME")
- }
-
- runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
- if err != nil {
- return errors.Wrapf(err, "could not get runtime")
- }
- defer runtime.DeferredShutdown(false)
-
- var to string
- if c.Latest {
- ctr, err := runtime.GetLatestContainer()
- if err != nil {
- return errors.Wrapf(err, "unable to get latest container")
- }
- to = ctr.ID()
- } else {
- to = c.InputArgs[0]
+func diff(cmd *cobra.Command, args []string) error {
+ if found, err := registry.ImageEngine().Exists(registry.GetContext(), args[0]); err != nil {
+ return err
+ } else if found.Value {
+ return images.Diff(cmd, args, diffOpts)
}
- changes, err := runtime.Diff(c, to)
- if err != nil {
- return errors.Wrapf(err, "could not get changes for %q", to)
- }
- diffOutput := []diffOutputParams{}
- outputFormat := c.Format
-
- for _, change := range changes {
-
- params := diffOutputParams{
- Change: change.Kind,
- Path: change.Path,
- }
- diffOutput = append(diffOutput, params)
- }
-
- var out formats.Writer
- if outputFormat != "" {
- switch outputFormat {
- case formats.JSONString:
- data, err := formatJSON(diffOutput)
- if err != nil {
- return err
- }
- out = formats.JSONStruct{Output: data}
- default:
- return errors.New("only valid format for diff is 'json'")
- }
- } else {
- out = stdoutStruct{output: diffOutput}
+ if found, err := registry.ContainerEngine().ContainerExists(registry.GetContext(), args[0]); err != nil {
+ return err
+ } else if found.Value {
+ return containers.Diff(cmd, args, diffOpts)
}
- return out.Out()
+ return fmt.Errorf("%s not found on system", args[0])
}