Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit 92bf8cc

Browse files
committed
simplification: remove intermediate pkg struct
Signed-off-by: Nicolas De Loof <[email protected]>
1 parent 9b4f291 commit 92bf8cc

File tree

1 file changed

+52
-105
lines changed

1 file changed

+52
-105
lines changed

internal/commands/image/list.go

Lines changed: 52 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,16 @@ import (
99
"text/tabwriter"
1010
"time"
1111

12-
"github.com/docker/cli/templates"
13-
"github.com/pkg/errors"
14-
1512
"github.com/docker/app/internal/packager"
1613
"github.com/docker/app/internal/relocated"
1714
"github.com/docker/app/internal/store"
1815
"github.com/docker/cli/cli/command"
1916
"github.com/docker/cli/cli/config"
17+
"github.com/docker/cli/templates"
2018
"github.com/docker/distribution/reference"
2119
"github.com/docker/docker/pkg/stringid"
2220
units "github.com/docker/go-units"
21+
"github.com/pkg/errors"
2322
"github.com/spf13/cobra"
2423
)
2524

@@ -29,11 +28,6 @@ type imageListOption struct {
2928
template string
3029
}
3130

32-
type imageListColumn struct {
33-
header string
34-
value func(desc imageDesc) string
35-
}
36-
3731
func listCmd(dockerCli command.Cli) *cobra.Command {
3832
options := imageListOption{}
3933
cmd := &cobra.Command{
@@ -64,49 +58,35 @@ func listCmd(dockerCli command.Cli) *cobra.Command {
6458
}
6559

6660
func runList(dockerCli command.Cli, options imageListOption, bundleStore store.BundleStore) error {
67-
bundles, err := bundleStore.List()
68-
if err != nil {
69-
return err
70-
}
71-
72-
pkgs, err := getPackages(bundleStore, bundles)
61+
images, err := getImageDescriptors(bundleStore)
7362
if err != nil {
7463
return err
7564
}
7665

7766
if options.quiet {
78-
return printImageIDs(dockerCli, pkgs)
67+
return printImageIDs(dockerCli, images)
7968
}
80-
return printImages(dockerCli, pkgs, options)
69+
return printImages(dockerCli, images, options)
8170
}
8271

83-
func getPackages(bundleStore store.BundleStore, references []reference.Reference) ([]pkg, error) {
84-
packages := make([]pkg, len(references))
72+
func getImageDescriptors(bundleStore store.BundleStore) ([]imageDesc, error) {
73+
references, err := bundleStore.List()
74+
if err != nil {
75+
return nil, err
76+
}
77+
images := make([]imageDesc, len(references))
8578
for i, ref := range references {
8679
b, err := bundleStore.Read(ref)
8780
if err != nil {
8881
return nil, err
8982
}
9083

91-
pk := pkg{
92-
bundle: b,
93-
ref: ref,
94-
}
95-
96-
packages[i] = pk
84+
images[i] = getImageDesc(b, ref)
9785
}
98-
99-
return packages, nil
86+
return images, nil
10087
}
10188

102-
func printImages(dockerCli command.Cli, refs []pkg, options imageListOption) error {
103-
w := tabwriter.NewWriter(dockerCli.Out(), 0, 0, 1, ' ', 0)
104-
105-
list := []imageDesc{}
106-
for _, ref := range refs {
107-
list = append(list, getImageDesc(ref))
108-
}
109-
89+
func printImages(dockerCli command.Cli, list []imageDesc, options imageListOption) error {
11090
if options.template == "json" {
11191
bytes, err := json.MarshalIndent(list, "", " ")
11292
if err != nil {
@@ -123,57 +103,45 @@ func printImages(dockerCli command.Cli, refs []pkg, options imageListOption) err
123103
return tmpl.Execute(dockerCli.Out(), list)
124104
}
125105

126-
listColumns := getImageListColumns(options)
127-
printHeaders(w, listColumns)
106+
w := tabwriter.NewWriter(dockerCli.Out(), 0, 0, 1, ' ', 0)
107+
printHeaders(w, options.digests)
128108
for _, desc := range list {
129-
printValues(w, desc, listColumns)
109+
desc.println(w, options.digests)
130110
}
131111

132112
return w.Flush()
133113
}
134114

135-
func printImageIDs(dockerCli command.Cli, refs []pkg) error {
115+
func printImageIDs(dockerCli command.Cli, refs []imageDesc) error {
136116
var buf bytes.Buffer
137-
138117
for _, ref := range refs {
139-
id, err := getImageID(ref)
140-
if err != nil {
141-
return err
142-
}
143-
fmt.Fprintln(&buf, id)
118+
fmt.Fprintln(&buf, ref.ID)
144119
}
145120
fmt.Fprint(dockerCli.Out(), buf.String())
146121
return nil
147122
}
148123

149-
func getImageID(p pkg) (string, error) {
150-
id, ok := p.ref.(store.ID)
124+
func getImageID(bundle *relocated.Bundle, ref reference.Reference) (string, error) {
125+
id, ok := ref.(store.ID)
151126
if !ok {
152127
var err error
153-
id, err = store.FromBundle(p.bundle)
128+
id, err = store.FromBundle(bundle)
154129
if err != nil {
155130
return "", err
156131
}
157132
}
158133
return stringid.TruncateID(id.String()), nil
159134
}
160135

161-
func printHeaders(w io.Writer, listColumns []imageListColumn) {
162-
var headers []string
163-
for _, column := range listColumns {
164-
headers = append(headers, column.header)
136+
func printHeaders(w io.Writer, digests bool) {
137+
headers := []string{"REPOSITORY", "TAG"}
138+
if digests {
139+
headers = append(headers, "DIGEST")
165140
}
141+
headers = append(headers, "APP IMAGE ID", "APP NAME", "CREATED")
166142
fmt.Fprintln(w, strings.Join(headers, "\t"))
167143
}
168144

169-
func printValues(w io.Writer, desc imageDesc, listColumns []imageListColumn) {
170-
var values []string
171-
for _, column := range listColumns {
172-
values = append(values, column.value(desc))
173-
}
174-
fmt.Fprintln(w, strings.Join(values, "\t"))
175-
}
176-
177145
type imageDesc struct {
178146
ID string `json:"id,omitempty"`
179147
Name string `json:"name,omitempty"`
@@ -183,78 +151,57 @@ type imageDesc struct {
183151
Created time.Duration `json:"created,omitempty"`
184152
}
185153

186-
func getImageDesc(p pkg) imageDesc {
154+
func getImageDesc(bundle *relocated.Bundle, ref reference.Reference) imageDesc {
187155
var id string
188-
id, _ = getImageID(p)
156+
id, _ = getImageID(bundle, ref)
189157
var repository string
190-
if n, ok := p.ref.(reference.Named); ok {
158+
if n, ok := ref.(reference.Named); ok {
191159
repository = reference.FamiliarName(n)
192160
}
193161
var tag string
194-
if t, ok := p.ref.(reference.Tagged); ok {
162+
if t, ok := ref.(reference.Tagged); ok {
195163
tag = t.Tag()
196164
}
197165
var digest string
198-
if t, ok := p.ref.(reference.Digested); ok {
166+
if t, ok := ref.(reference.Digested); ok {
199167
digest = t.Digest().String()
200168
}
201169
var created time.Duration
202-
if payload, err := packager.CustomPayload(p.bundle.Bundle); err == nil {
170+
if payload, err := packager.CustomPayload(bundle.Bundle); err == nil {
203171
if createdPayload, ok := payload.(packager.CustomPayloadCreated); ok {
204172
created = time.Now().UTC().Sub(createdPayload.CreatedTime())
205173
}
206174
}
207175
return imageDesc{
208176
ID: id,
209-
Name: p.bundle.Name,
177+
Name: bundle.Name,
210178
Repository: repository,
211179
Tag: tag,
212180
Digest: digest,
213181
Created: created,
214182
}
215183
}
216184

217-
func getImageListColumns(options imageListOption) []imageListColumn {
218-
columns := []imageListColumn{
219-
{"REPOSITORY", func(desc imageDesc) string {
220-
if desc.Repository != "" {
221-
return desc.Repository
222-
}
223-
return "<none>"
224-
}},
225-
{"TAG", func(desc imageDesc) string {
226-
if desc.Tag != "" {
227-
return desc.Tag
228-
}
229-
return "<none>"
230-
}},
185+
func (desc imageDesc) humanDuration() string {
186+
if desc.Created > 0 {
187+
return units.HumanDuration(desc.Created) + " ago"
231188
}
232-
if options.digests {
233-
columns = append(columns, imageListColumn{"DIGEST", func(desc imageDesc) string {
234-
if desc.Digest != "" {
235-
return desc.Digest
236-
}
237-
return "<none>"
238-
}})
189+
return ""
190+
}
191+
192+
func (desc imageDesc) println(w io.Writer, digests bool) {
193+
values := []string{}
194+
values = append(values, orNone(desc.Repository), orNone(desc.Tag))
195+
if digests {
196+
values = append(values, orNone(desc.Digest))
239197
}
240-
columns = append(columns,
241-
imageListColumn{"APP IMAGE ID", func(desc imageDesc) string {
242-
return desc.ID
243-
}},
244-
imageListColumn{"APP NAME", func(desc imageDesc) string {
245-
return desc.Name
246-
}},
247-
imageListColumn{"CREATED", func(desc imageDesc) string {
248-
if desc.Created > 0 {
249-
return units.HumanDuration(desc.Created) + " ago"
250-
}
251-
return ""
252-
}},
253-
)
254-
return columns
198+
values = append(values, desc.ID, desc.Name, desc.humanDuration())
199+
fmt.Fprintln(w, strings.Join(values, "\t"))
255200
}
256201

257-
type pkg struct {
258-
ref reference.Reference
259-
bundle *relocated.Bundle
202+
func orNone(s string) string {
203+
if s != "" {
204+
return s
205+
}
206+
return "<none>"
260207
}

0 commit comments

Comments
 (0)