summaryrefslogtreecommitdiff
path: root/cmd/podman/diff/diff.go
diff options
context:
space:
mode:
authorOpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com>2021-07-03 06:17:03 -0400
committerGitHub <noreply@github.com>2021-07-03 06:17:03 -0400
commit895b8151889422aac1f9b72eebe6d62e8e15095c (patch)
tree3694e61ecedcb8c8fb1b59dd12e1e882d7ce6ae0 /cmd/podman/diff/diff.go
parent07716133c44c9c9593364029f4b98085d1be3bdd (diff)
parent8f6a0243f4b7f861a116c0dba5967b3cfe23d61f (diff)
downloadpodman-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.go79
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
+}