diff options
Diffstat (limited to 'cmd/podmanV2')
-rw-r--r-- | cmd/podmanV2/images/history.go | 76 | ||||
-rw-r--r-- | cmd/podmanV2/registry/registry.go | 11 | ||||
-rw-r--r-- | cmd/podmanV2/root.go | 12 |
3 files changed, 81 insertions, 18 deletions
diff --git a/cmd/podmanV2/images/history.go b/cmd/podmanV2/images/history.go index c75ae6ddc..f6f15e2f2 100644 --- a/cmd/podmanV2/images/history.go +++ b/cmd/podmanV2/images/history.go @@ -4,12 +4,15 @@ import ( "context" "fmt" "os" + "strings" "text/tabwriter" "text/template" + "time" "github.com/containers/libpod/cmd/podmanV2/registry" "github.com/containers/libpod/cmd/podmanV2/report" "github.com/containers/libpod/pkg/domain/entities" + jsoniter "github.com/json-iterator/go" "github.com/pkg/errors" "github.com/spf13/cobra" ) @@ -29,14 +32,14 @@ var ( PersistentPreRunE: preRunE, RunE: history, } -) -var cmdFlags = struct { - Human bool - NoTrunc bool - Quiet bool - Format string -}{} + opts = struct { + human bool + noTrunc bool + quiet bool + format string + }{} +) func init() { registry.Commands = append(registry.Commands, registry.CliCommand{ @@ -46,12 +49,13 @@ func init() { historyCmd.SetHelpTemplate(registry.HelpTemplate()) historyCmd.SetUsageTemplate(registry.UsageTemplate()) + flags := historyCmd.Flags() - flags.StringVar(&cmdFlags.Format, "format", "", "Change the output to JSON or a Go template") - flags.BoolVarP(&cmdFlags.Human, "human", "H", true, "Display sizes and dates in human readable format") - flags.BoolVar(&cmdFlags.NoTrunc, "no-trunc", false, "Do not truncate the output") - flags.BoolVar(&cmdFlags.NoTrunc, "notruncate", false, "Do not truncate the output") - flags.BoolVarP(&cmdFlags.Quiet, "quiet", "q", false, "Display the numeric IDs only") + flags.StringVar(&opts.format, "format", "", "Change the output to JSON or a Go template") + flags.BoolVarP(&opts.human, "human", "H", false, "Display sizes and dates in human readable format") + flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Do not truncate the output") + flags.BoolVar(&opts.noTrunc, "notruncate", false, "Do not truncate the output") + flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Display the numeric IDs only") } func history(cmd *cobra.Command, args []string) error { @@ -60,11 +64,51 @@ func history(cmd *cobra.Command, args []string) error { return err } - row := "{{slice $x.ID 0 12}}\t{{toRFC3339 $x.Created}}\t{{ellipsis $x.CreatedBy 45}}\t{{$x.Size}}\t{{$x.Comment}}\n" - if cmdFlags.Human { - row = "{{slice $x.ID 0 12}}\t{{toHumanDuration $x.Created}}\t{{ellipsis $x.CreatedBy 45}}\t{{toHumanSize $x.Size}}\t{{$x.Comment}}\n" + if opts.format == "json" { + var err error + if len(results.Layers) == 0 { + _, err = fmt.Fprintf(os.Stdout, "[]\n") + } else { + // ah-hoc change to "Created": type and format + type layer struct { + entities.ImageHistoryLayer + Created string `json:"Created"` + } + + layers := make([]layer, len(results.Layers)) + for i, l := range results.Layers { + layers[i].ImageHistoryLayer = l + layers[i].Created = time.Unix(l.Created, 0).Format(time.RFC3339) + } + json := jsoniter.ConfigCompatibleWithStandardLibrary + enc := json.NewEncoder(os.Stdout) + err = enc.Encode(layers) + } + return err + } + + // Defaults + hdr := "ID\tCREATED\tCREATED BY\tSIZE\tCOMMENT\n" + row := "{{slice .ID 0 12}}\t{{humanDuration .Created}}\t{{ellipsis .CreatedBy 45}}\t{{.Size}}\t{{.Comment}}\n" + + if len(opts.format) > 0 { + hdr = "" + row = opts.format + if !strings.HasSuffix(opts.format, "\n") { + row += "\n" + } + } else { + switch { + case opts.human: + row = "{{slice .ID 0 12}}\t{{humanDuration .Created}}\t{{ellipsis .CreatedBy 45}}\t{{humanSize .Size}}\t{{.Comment}}\n" + case opts.noTrunc: + row = "{{.ID}}\t{{humanDuration .Created}}\t{{.CreatedBy}}\t{{humanSize .Size}}\t{{.Comment}}\n" + case opts.quiet: + hdr = "" + row = "{{.ID}}\n" + } } - format := "{{range $y, $x := . }}" + row + "{{end}}" + format := hdr + "{{range . }}" + row + "{{end}}" tmpl := template.Must(template.New("report").Funcs(report.PodmanTemplateFuncs()).Parse(format)) w := tabwriter.NewWriter(os.Stdout, 8, 2, 2, ' ', 0) diff --git a/cmd/podmanV2/registry/registry.go b/cmd/podmanV2/registry/registry.go index 793d520a8..b0c11ba04 100644 --- a/cmd/podmanV2/registry/registry.go +++ b/cmd/podmanV2/registry/registry.go @@ -1,6 +1,7 @@ package registry import ( + "github.com/containers/libpod/libpod/define" "github.com/containers/libpod/pkg/domain/entities" "github.com/containers/libpod/pkg/domain/infra" "github.com/pkg/errors" @@ -21,8 +22,18 @@ var ( EngineOpts entities.EngineOptions GlobalFlags entities.EngineFlags + + ExitCode = define.ExecErrorCodeGeneric ) +func SetExitCode(code int) { + ExitCode = code +} + +func GetExitCode() int { + return ExitCode +} + // HelpTemplate returns the help template for podman commands // This uses the short and long options. // command should not use this. diff --git a/cmd/podmanV2/root.go b/cmd/podmanV2/root.go index b0dd7643f..2becd126d 100644 --- a/cmd/podmanV2/root.go +++ b/cmd/podmanV2/root.go @@ -6,6 +6,7 @@ import ( "path" "github.com/containers/libpod/cmd/podmanV2/registry" + "github.com/containers/libpod/libpod/define" "github.com/containers/libpod/version" "github.com/spf13/cobra" ) @@ -31,7 +32,14 @@ func init() { func Execute() { if err := rootCmd.Execute(); err != nil { - fmt.Println(err) - os.Exit(1) + fmt.Fprintln(os.Stderr, "Error:", err.Error()) + } else if registry.GetExitCode() == define.ExecErrorCodeGeneric { + // The exitCode modified from define.ExecErrorCodeGeneric, + // indicates an application + // running inside of a container failed, as opposed to the + // podman command failed. Must exit with that exit code + // otherwise command exited correctly. + registry.SetExitCode(0) } + os.Exit(registry.GetExitCode()) } |