diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2021-07-03 06:17:03 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-03 06:17:03 -0400 |
commit | 895b8151889422aac1f9b72eebe6d62e8e15095c (patch) | |
tree | 3694e61ecedcb8c8fb1b59dd12e1e882d7ce6ae0 /cmd/podman/diff/diff.go | |
parent | 07716133c44c9c9593364029f4b98085d1be3bdd (diff) | |
parent | 8f6a0243f4b7f861a116c0dba5967b3cfe23d61f (diff) | |
download | podman-895b8151889422aac1f9b72eebe6d62e8e15095c.tar.gz podman-895b8151889422aac1f9b72eebe6d62e8e15095c.tar.bz2 podman-895b8151889422aac1f9b72eebe6d62e8e15095c.zip |
Merge pull request #10836 from Luap99/diff
podman diff accept two images or containers
Diffstat (limited to 'cmd/podman/diff/diff.go')
-rw-r--r-- | cmd/podman/diff/diff.go | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/cmd/podman/diff/diff.go b/cmd/podman/diff/diff.go new file mode 100644 index 000000000..81bbb6c43 --- /dev/null +++ b/cmd/podman/diff/diff.go @@ -0,0 +1,79 @@ +package diff + +import ( + "encoding/json" + "fmt" + "os" + + "github.com/containers/common/pkg/report" + "github.com/containers/podman/v3/cmd/podman/registry" + "github.com/containers/podman/v3/pkg/domain/entities" + "github.com/docker/docker/pkg/archive" + "github.com/pkg/errors" + "github.com/spf13/cobra" +) + +func Diff(cmd *cobra.Command, args []string, options entities.DiffOptions) error { + results, err := registry.ContainerEngine().Diff(registry.GetContext(), args, options) + if err != nil { + return err + } + + switch { + case report.IsJSON(options.Format): + return changesToJSON(results) + case options.Format == "": + return changesToTable(results) + default: + return errors.New("only supported value for '--format' is 'json'") + } +} + +type ChangesReportJSON struct { + Changed []string `json:"changed,omitempty"` + Added []string `json:"added,omitempty"` + Deleted []string `json:"deleted,omitempty"` +} + +func changesToJSON(diffs *entities.DiffReport) error { + body := ChangesReportJSON{} + for _, row := range diffs.Changes { + switch row.Kind { + case archive.ChangeAdd: + body.Added = append(body.Added, row.Path) + case archive.ChangeDelete: + body.Deleted = append(body.Deleted, row.Path) + case archive.ChangeModify: + body.Changed = append(body.Changed, row.Path) + default: + return errors.Errorf("output kind %q not recognized", row.Kind) + } + } + + // Pull in configured json library + enc := json.NewEncoder(os.Stdout) + enc.SetIndent("", " ") + return enc.Encode(body) +} + +func changesToTable(diffs *entities.DiffReport) error { + for _, row := range diffs.Changes { + fmt.Fprintln(os.Stdout, row.String()) + } + return nil +} + +// IDOrLatestArgs used to validate a nameOrId was provided or the "--latest" flag +func ValidateContainerDiffArgs(cmd *cobra.Command, args []string) error { + given, _ := cmd.Flags().GetBool("latest") + if len(args) > 0 && !given { + return cobra.RangeArgs(1, 2)(cmd, args) + } + if len(args) > 0 && given { + return errors.New("--latest and containers cannot be used together") + } + if len(args) == 0 && !given { + return errors.Errorf("%q requires a name, id, or the \"--latest\" flag", cmd.CommandPath()) + } + return nil +} |