Fixes #6670
* 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:
parent
1a2eb3e615
commit
ea8e61e4eb
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue