mirror of
https://github.com/podman-container-tools/podman.git
synced 2026-08-09 18:35:42 +00:00
The --format flags accepts go template strings. I use this often but I
consistently forget the field names. This commit adds a way to provide
shell completion for the --format flag. It works by automatically
receiving the field names with the reflect package from the given
struct. This requires almost no maintenance since this ensures that we
always use the correct field names. This also works for nested structs.
```
$ podman ps --format "{{.P"
{{.Pid}} {{.PIDNS}} {{.Pod}} {{.PodName}} {{.Ports}}
```
NOTE: This only works when you use quotes otherwise the shell does not
provide completions. Also this does not work for fish at the moment.
Signed-off-by: Paul Holzinger <paul.holzinger@web.de>
73 lines
2.3 KiB
Go
73 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/containers/podman/v3/cmd/podman/common"
|
|
"github.com/containers/podman/v3/cmd/podman/containers"
|
|
"github.com/containers/podman/v3/cmd/podman/images"
|
|
"github.com/containers/podman/v3/cmd/podman/registry"
|
|
"github.com/containers/podman/v3/cmd/podman/validate"
|
|
"github.com/containers/podman/v3/pkg/domain/entities"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
// Inspect is one of the outlier commands in that it operates on images/containers/...
|
|
|
|
var (
|
|
// 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 [options] {CONTAINER|IMAGE}",
|
|
Args: validate.IDOrLatestArgs,
|
|
Short: "Display the changes to the object's file system",
|
|
Long: diffDescription,
|
|
RunE: diff,
|
|
ValidArgsFunction: common.AutocompleteContainersAndImages,
|
|
Example: `podman diff imageID
|
|
podman diff ctrID
|
|
podman diff --format json redis:alpine`,
|
|
}
|
|
|
|
diffOpts = entities.DiffOptions{}
|
|
)
|
|
|
|
func init() {
|
|
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")
|
|
|
|
formatFlagName := "format"
|
|
flags.StringVar(&diffOpts.Format, formatFlagName, "", "Change the output format")
|
|
_ = diffCmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteFormat(nil))
|
|
|
|
validate.AddLatestFlag(diffCmd, &diffOpts.Latest)
|
|
}
|
|
|
|
func diff(cmd *cobra.Command, args []string) error {
|
|
// Latest implies looking for a container
|
|
if diffOpts.Latest {
|
|
return containers.Diff(cmd, args, diffOpts)
|
|
}
|
|
|
|
options := entities.ContainerExistsOptions{
|
|
External: true,
|
|
}
|
|
if found, err := registry.ContainerEngine().ContainerExists(registry.GetContext(), args[0], options); err != nil {
|
|
return err
|
|
} else if found.Value {
|
|
return containers.Diff(cmd, args, diffOpts)
|
|
}
|
|
|
|
if found, err := registry.ImageEngine().Exists(registry.GetContext(), args[0]); err != nil {
|
|
return err
|
|
} else if found.Value {
|
|
return images.Diff(cmd, args, diffOpts)
|
|
}
|
|
|
|
return fmt.Errorf("%s not found on system", args[0])
|
|
}
|