github.com/containers/libpod@v1.9.4-0.20220419124438-4284fd425507/cmd/podmanV2/diff.go (about) 1 package main 2 3 import ( 4 "fmt" 5 6 "github.com/containers/libpod/cmd/podmanV2/containers" 7 "github.com/containers/libpod/cmd/podmanV2/images" 8 "github.com/containers/libpod/cmd/podmanV2/registry" 9 "github.com/containers/libpod/pkg/domain/entities" 10 "github.com/spf13/cobra" 11 ) 12 13 // Inspect is one of the outlier commands in that it operates on images/containers/... 14 15 var ( 16 // Command: podman _diff_ Object_ID 17 diffDescription = `Displays changes on a container or image's filesystem. The container or image will be compared to its parent layer.` 18 diffCmd = &cobra.Command{ 19 Use: "diff [flags] {CONTAINER_ID | IMAGE_ID}", 20 Args: registry.IdOrLatestArgs, 21 Short: "Display the changes of object's file system", 22 Long: diffDescription, 23 TraverseChildren: true, 24 RunE: diff, 25 Example: `podman diff imageID 26 podman diff ctrID 27 podman diff --format json redis:alpine`, 28 } 29 30 diffOpts = entities.DiffOptions{} 31 ) 32 33 func init() { 34 registry.Commands = append(registry.Commands, registry.CliCommand{ 35 Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, 36 Command: diffCmd, 37 }) 38 diffCmd.SetHelpTemplate(registry.HelpTemplate()) 39 diffCmd.SetUsageTemplate(registry.UsageTemplate()) 40 41 flags := diffCmd.Flags() 42 flags.BoolVar(&diffOpts.Archive, "archive", true, "Save the diff as a tar archive") 43 _ = flags.MarkHidden("archive") 44 flags.StringVar(&diffOpts.Format, "format", "", "Change the output format") 45 46 if !registry.IsRemote() { 47 flags.BoolVarP(&diffOpts.Latest, "latest", "l", false, "Act on the latest container podman is aware of") 48 } 49 } 50 51 func diff(cmd *cobra.Command, args []string) error { 52 ie, err := registry.NewImageEngine(cmd, args) 53 if err != nil { 54 return err 55 } 56 57 if found, err := ie.Exists(registry.GetContext(), args[0]); err != nil { 58 return err 59 } else if found.Value { 60 return images.Diff(cmd, args, diffOpts) 61 } 62 63 ce, err := registry.NewContainerEngine(cmd, args) 64 if err != nil { 65 return err 66 } 67 68 if found, err := ce.ContainerExists(registry.GetContext(), args[0]); err != nil { 69 return err 70 } else if found.Value { 71 return containers.Diff(cmd, args, diffOpts) 72 } 73 return fmt.Errorf("%s not found on system", args[0]) 74 }