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  }