@@ -9,17 +9,16 @@ import (
9
9
"text/tabwriter"
10
10
"time"
11
11
12
- "github.com/docker/cli/templates"
13
- "github.com/pkg/errors"
14
-
15
12
"github.com/docker/app/internal/packager"
16
13
"github.com/docker/app/internal/relocated"
17
14
"github.com/docker/app/internal/store"
18
15
"github.com/docker/cli/cli/command"
19
16
"github.com/docker/cli/cli/config"
17
+ "github.com/docker/cli/templates"
20
18
"github.com/docker/distribution/reference"
21
19
"github.com/docker/docker/pkg/stringid"
22
20
units "github.com/docker/go-units"
21
+ "github.com/pkg/errors"
23
22
"github.com/spf13/cobra"
24
23
)
25
24
@@ -29,11 +28,6 @@ type imageListOption struct {
29
28
template string
30
29
}
31
30
32
- type imageListColumn struct {
33
- header string
34
- value func (desc imageDesc ) string
35
- }
36
-
37
31
func listCmd (dockerCli command.Cli ) * cobra.Command {
38
32
options := imageListOption {}
39
33
cmd := & cobra.Command {
@@ -64,49 +58,35 @@ func listCmd(dockerCli command.Cli) *cobra.Command {
64
58
}
65
59
66
60
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 )
73
62
if err != nil {
74
63
return err
75
64
}
76
65
77
66
if options .quiet {
78
- return printImageIDs (dockerCli , pkgs )
67
+ return printImageIDs (dockerCli , images )
79
68
}
80
- return printImages (dockerCli , pkgs , options )
69
+ return printImages (dockerCli , images , options )
81
70
}
82
71
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 ))
85
78
for i , ref := range references {
86
79
b , err := bundleStore .Read (ref )
87
80
if err != nil {
88
81
return nil , err
89
82
}
90
83
91
- pk := pkg {
92
- bundle : b ,
93
- ref : ref ,
94
- }
95
-
96
- packages [i ] = pk
84
+ images [i ] = getImageDesc (b , ref )
97
85
}
98
-
99
- return packages , nil
86
+ return images , nil
100
87
}
101
88
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 {
110
90
if options .template == "json" {
111
91
bytes , err := json .MarshalIndent (list , "" , " " )
112
92
if err != nil {
@@ -123,57 +103,45 @@ func printImages(dockerCli command.Cli, refs []pkg, options imageListOption) err
123
103
return tmpl .Execute (dockerCli .Out (), list )
124
104
}
125
105
126
- listColumns := getImageListColumns ( options )
127
- printHeaders (w , listColumns )
106
+ w := tabwriter . NewWriter ( dockerCli . Out (), 0 , 0 , 1 , ' ' , 0 )
107
+ printHeaders (w , options . digests )
128
108
for _ , desc := range list {
129
- printValues (w , desc , listColumns )
109
+ desc . println (w , options . digests )
130
110
}
131
111
132
112
return w .Flush ()
133
113
}
134
114
135
- func printImageIDs (dockerCli command.Cli , refs []pkg ) error {
115
+ func printImageIDs (dockerCli command.Cli , refs []imageDesc ) error {
136
116
var buf bytes.Buffer
137
-
138
117
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 )
144
119
}
145
120
fmt .Fprint (dockerCli .Out (), buf .String ())
146
121
return nil
147
122
}
148
123
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 )
151
126
if ! ok {
152
127
var err error
153
- id , err = store .FromBundle (p . bundle )
128
+ id , err = store .FromBundle (bundle )
154
129
if err != nil {
155
130
return "" , err
156
131
}
157
132
}
158
133
return stringid .TruncateID (id .String ()), nil
159
134
}
160
135
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" )
165
140
}
141
+ headers = append (headers , "APP IMAGE ID" , "APP NAME" , "CREATED" )
166
142
fmt .Fprintln (w , strings .Join (headers , "\t " ))
167
143
}
168
144
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
-
177
145
type imageDesc struct {
178
146
ID string `json:"id,omitempty"`
179
147
Name string `json:"name,omitempty"`
@@ -183,78 +151,57 @@ type imageDesc struct {
183
151
Created time.Duration `json:"created,omitempty"`
184
152
}
185
153
186
- func getImageDesc (p pkg ) imageDesc {
154
+ func getImageDesc (bundle * relocated. Bundle , ref reference. Reference ) imageDesc {
187
155
var id string
188
- id , _ = getImageID (p )
156
+ id , _ = getImageID (bundle , ref )
189
157
var repository string
190
- if n , ok := p . ref .(reference.Named ); ok {
158
+ if n , ok := ref .(reference.Named ); ok {
191
159
repository = reference .FamiliarName (n )
192
160
}
193
161
var tag string
194
- if t , ok := p . ref .(reference.Tagged ); ok {
162
+ if t , ok := ref .(reference.Tagged ); ok {
195
163
tag = t .Tag ()
196
164
}
197
165
var digest string
198
- if t , ok := p . ref .(reference.Digested ); ok {
166
+ if t , ok := ref .(reference.Digested ); ok {
199
167
digest = t .Digest ().String ()
200
168
}
201
169
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 {
203
171
if createdPayload , ok := payload .(packager.CustomPayloadCreated ); ok {
204
172
created = time .Now ().UTC ().Sub (createdPayload .CreatedTime ())
205
173
}
206
174
}
207
175
return imageDesc {
208
176
ID : id ,
209
- Name : p . bundle .Name ,
177
+ Name : bundle .Name ,
210
178
Repository : repository ,
211
179
Tag : tag ,
212
180
Digest : digest ,
213
181
Created : created ,
214
182
}
215
183
}
216
184
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"
231
188
}
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 ))
239
197
}
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 " ))
255
200
}
256
201
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>"
260
207
}
0 commit comments