* Sort images for -q option, removing duplicate id's
* Sort images for --format json

Signed-off-by: Jhon Honce <jhonce@redhat.com>
This commit is contained in:
Jhon Honce 2020-06-18 09:26:07 -07:00
parent 1a2eb3e615
commit ea8e61e4eb
2 changed files with 47 additions and 33 deletions

View File

@ -98,44 +98,46 @@ func images(cmd *cobra.Command, args []string) error {
return err return err
} }
imgs := sortImages(summaries)
switch { switch {
case listFlag.quiet: case listFlag.quiet:
return writeID(summaries) return writeID(imgs)
case cmd.Flag("format").Changed && listFlag.format == "json": case cmd.Flag("format").Changed && listFlag.format == "json":
return writeJSON(summaries) return writeJSON(imgs)
default: default:
return writeTemplate(summaries) return writeTemplate(imgs)
} }
} }
func writeID(imageS []*entities.ImageSummary) error { func writeID(imgs []imageReporter) error {
var ids = map[string]struct{}{} lookup := make(map[string]struct{}, len(imgs))
for _, e := range imageS { ids := make([]string, 0)
i := "sha256:" + e.ID
if !listFlag.noTrunc { for _, e := range imgs {
i = fmt.Sprintf("%12.12s", e.ID) if _, found := lookup[e.ID()]; !found {
lookup[e.ID()] = struct{}{}
ids = append(ids, e.ID())
} }
ids[i] = struct{}{}
} }
for k := range ids { for _, k := range ids {
fmt.Fprint(os.Stdout, k+"\n") fmt.Println(k)
} }
return nil return nil
} }
func writeJSON(imageS []*entities.ImageSummary) error { func writeJSON(images []imageReporter) error {
type image struct { type image struct {
entities.ImageSummary entities.ImageSummary
Created string Created string
CreatedAt string CreatedAt string
} }
imgs := make([]image, 0, len(imageS)) imgs := make([]image, 0, len(images))
for _, e := range imageS { for _, e := range images {
var h image var h image
h.ImageSummary = *e h.ImageSummary = e.ImageSummary
h.Created = units.HumanDuration(time.Since(e.Created)) + " ago" h.Created = units.HumanDuration(time.Since(e.ImageSummary.Created)) + " ago"
h.CreatedAt = e.Created.Format(time.RFC3339Nano) h.CreatedAt = e.ImageSummary.Created.Format(time.RFC3339Nano)
h.RepoTags = nil h.RepoTags = nil
imgs = append(imgs, h) imgs = append(imgs, h)
@ -149,10 +151,26 @@ func writeJSON(imageS []*entities.ImageSummary) error {
return nil return nil
} }
func writeTemplate(imageS []*entities.ImageSummary) error { func writeTemplate(imgs []imageReporter) error {
var ( var (
hdr, row string hdr, row string
) )
if len(listFlag.format) < 1 {
hdr, row = imageListFormat(listFlag)
} else {
row = listFlag.format
if !strings.HasSuffix(row, "\n") {
row += "\n"
}
}
format := hdr + "{{range . }}" + row + "{{end}}"
tmpl := template.Must(template.New("list").Parse(format))
w := tabwriter.NewWriter(os.Stdout, 8, 2, 2, ' ', 0)
defer w.Flush()
return tmpl.Execute(w, imgs)
}
func sortImages(imageS []*entities.ImageSummary) []imageReporter {
imgs := make([]imageReporter, 0, len(imageS)) imgs := make([]imageReporter, 0, len(imageS))
for _, e := range imageS { for _, e := range imageS {
var h imageReporter var h imageReporter
@ -171,20 +189,7 @@ func writeTemplate(imageS []*entities.ImageSummary) error {
} }
sort.Slice(imgs, sortFunc(listFlag.sort, imgs)) sort.Slice(imgs, sortFunc(listFlag.sort, imgs))
return imgs
if len(listFlag.format) < 1 {
hdr, row = imageListFormat(listFlag)
} else {
row = listFlag.format
if !strings.HasSuffix(row, "\n") {
row += "\n"
}
}
format := hdr + "{{range . }}" + row + "{{end}}"
tmpl := template.Must(template.New("list").Parse(format))
w := tabwriter.NewWriter(os.Stdout, 8, 2, 2, ' ', 0)
defer w.Flush()
return tmpl.Execute(w, imgs)
} }
func tokenRepoTag(tag string) (string, string) { func tokenRepoTag(tag string) (string, string) {

View File

@ -296,6 +296,15 @@ WORKDIR /test
sortValueTest("id", 125, "badvalue") sortValueTest("id", 125, "badvalue")
}) })
It("test for issue #6670", func() {
expected := podmanTest.Podman([]string{"images", "--sort", "created", "--format", "{{.ID}}", "-q"})
expected.WaitWithDefaultTimeout()
actual := podmanTest.Podman([]string{"images", "--sort", "created", "-q"})
actual.WaitWithDefaultTimeout()
Expect(expected.Out).Should(Equal(actual.Out))
})
It("podman images --all flag", func() { It("podman images --all flag", func() {
podmanTest.RestoreAllArtifacts() podmanTest.RestoreAllArtifacts()
dockerfile := `FROM docker.io/library/alpine:latest dockerfile := `FROM docker.io/library/alpine:latest