@@ -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-
3731func 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
6660func 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-
177145type 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