@@ -82,6 +82,13 @@ type outputter interface {
82
82
MissingFooter () error
83
83
}
84
84
85
+ // Only a subset of the outputters should be able to output old statuses
86
+ type oldOutputter interface {
87
+ OldHeader () error
88
+ OldLine (* OldStatus ) error
89
+ OldFooter () error
90
+ }
91
+
85
92
type tableOutput struct { w * tabwriter.Writer }
86
93
87
94
func (out * tableOutput ) BasicHeader () error {
@@ -124,10 +131,31 @@ func (out *tableOutput) MissingFooter() error {
124
131
return out .w .Flush ()
125
132
}
126
133
134
+ func (out * tableOutput ) OldHeader () error {
135
+ _ , err := fmt .Fprintf (out .w , "PROJECT\t CONSTRAINT\t REVISION\t LATEST\n " )
136
+ return err
137
+ }
138
+
139
+ func (out * tableOutput ) OldLine (os * OldStatus ) error {
140
+ _ , err := fmt .Fprintf (out .w ,
141
+ "%s\t %s\t %s\t %s\t \n " ,
142
+ os .ProjectRoot ,
143
+ os .getConsolidatedConstraint (),
144
+ formatVersion (os .Revision ),
145
+ os .getConsolidatedLatest (shortRev ),
146
+ )
147
+ return err
148
+ }
149
+
150
+ func (out * tableOutput ) OldFooter () error {
151
+ return out .w .Flush ()
152
+ }
153
+
127
154
type jsonOutput struct {
128
155
w io.Writer
129
156
basic []* rawStatus
130
157
missing []* MissingStatus
158
+ old []* rawOldStatus
131
159
}
132
160
133
161
func (out * jsonOutput ) BasicHeader () error {
@@ -158,6 +186,20 @@ func (out *jsonOutput) MissingFooter() error {
158
186
return json .NewEncoder (out .w ).Encode (out .missing )
159
187
}
160
188
189
+ func (out * jsonOutput ) OldHeader () error {
190
+ out .old = []* rawOldStatus {}
191
+ return nil
192
+ }
193
+
194
+ func (out * jsonOutput ) OldLine (os * OldStatus ) error {
195
+ out .old = append (out .old , os .marshalJSON ())
196
+ return nil
197
+ }
198
+
199
+ func (out * jsonOutput ) OldFooter () error {
200
+ return json .NewEncoder (out .w ).Encode (out .old )
201
+ }
202
+
161
203
type dotOutput struct {
162
204
w io.Writer
163
205
o string
@@ -237,8 +279,6 @@ func (cmd *statusCommand) Run(ctx *dep.Ctx, args []string) error {
237
279
switch {
238
280
case cmd .missing :
239
281
return errors .Errorf ("not implemented" )
240
- case cmd .old :
241
- cmd .runOld (ctx , args , p , sm )
242
282
case cmd .json :
243
283
out = & jsonOutput {
244
284
w : & buf ,
@@ -269,6 +309,15 @@ func (cmd *statusCommand) Run(ctx *dep.Ctx, args []string) error {
269
309
return errors .Errorf ("no Gopkg.lock found. Run `dep ensure` to generate lock file" )
270
310
}
271
311
312
+ if cmd .old {
313
+ if _ , ok := out .(oldOutputter ); ! ok {
314
+ return errors .Errorf ("invalid output command usesed" )
315
+ }
316
+ err = cmd .runOld (ctx , out .(oldOutputter ), p , sm )
317
+ ctx .Out .Print (buf .String ())
318
+ return err
319
+ }
320
+
272
321
hasMissingPkgs , errCount , err := runStatusAll (ctx , out , p , sm )
273
322
if err != nil {
274
323
switch err {
@@ -305,6 +354,9 @@ func (cmd *statusCommand) validateFlags() error {
305
354
opModes := []string {}
306
355
307
356
if cmd .old {
357
+ if cmd .template != "" {
358
+ return errors .New ("cannot pass template string with -old" )
359
+ }
308
360
opModes = append (opModes , "-old" )
309
361
}
310
362
@@ -340,12 +392,49 @@ func (cmd *statusCommand) validateFlags() error {
340
392
type OldStatus struct {
341
393
ProjectRoot string
342
394
Constraint gps.Constraint
343
- Version gps.UnpairedVersion
344
395
Revision gps.Revision
345
396
Latest gps.Version
346
397
}
347
398
348
- func (cmd * statusCommand ) runOld (ctx * dep.Ctx , args []string , p * dep.Project , sm gps.SourceManager ) error {
399
+ type rawOldStatus struct {
400
+ ProjectRoot , Constraint , Revision , Latest string
401
+ }
402
+
403
+ func (os OldStatus ) getConsolidatedConstraint () string {
404
+ var constraint string
405
+ if os .Constraint != nil {
406
+ if v , ok := os .Constraint .(gps.Version ); ok {
407
+ constraint = formatVersion (v )
408
+ } else {
409
+ constraint = os .Constraint .String ()
410
+ }
411
+ }
412
+ return constraint
413
+ }
414
+
415
+ func (os OldStatus ) getConsolidatedLatest (revSize uint8 ) string {
416
+ latest := ""
417
+ if os .Latest != nil {
418
+ switch revSize {
419
+ case shortRev :
420
+ latest = formatVersion (os .Latest )
421
+ case longRev :
422
+ latest = os .Latest .String ()
423
+ }
424
+ }
425
+ return latest
426
+ }
427
+
428
+ func (os OldStatus ) marshalJSON () * rawOldStatus {
429
+ return & rawOldStatus {
430
+ ProjectRoot : os .ProjectRoot ,
431
+ Constraint : os .getConsolidatedConstraint (),
432
+ Revision : string (os .Revision ),
433
+ Latest : os .getConsolidatedLatest (longRev ),
434
+ }
435
+ }
436
+
437
+ func (cmd * statusCommand ) runOld (ctx * dep.Ctx , out oldOutputter , p * dep.Project , sm gps.SourceManager ) error {
349
438
// While the network churns on ListVersions() requests, statically analyze
350
439
// code from the current project.
351
440
ptree , err := p .ParseRootPackageTree ()
@@ -375,22 +464,48 @@ func (cmd *statusCommand) runOld(ctx *dep.Ctx, args []string, p *dep.Project, sm
375
464
return errors .Wrap (err , "runOld" )
376
465
}
377
466
378
- var oldLockProjects []gps.LockedProject
379
- lockProjects := p .Lock .Projects ()
467
+ var oldStatuses []OldStatus
380
468
solutionProjects := solution .Projects ()
381
469
382
- for i := range solutionProjects {
383
- spr , _ , _ := gps .VersionComponentStrings (solutionProjects [i ].Version ())
384
- lpr , _ , _ := gps .VersionComponentStrings (lockProjects [i ].Version ())
470
+ for _ , proj := range p .Lock .Projects () {
471
+ for i := range solutionProjects {
472
+ // Look for the same project in solution and lock
473
+ if solutionProjects [i ].Ident ().ProjectRoot != proj .Ident ().ProjectRoot {
474
+ continue
475
+ }
476
+
477
+ // If revisions are not the same then it is old and we should display it
478
+ latestRev , _ , _ := gps .VersionComponentStrings (solutionProjects [i ].Version ())
479
+ atRev , _ , _ := gps .VersionComponentStrings (proj .Version ())
480
+ if atRev == latestRev {
481
+ continue
482
+ }
385
483
386
- if spr != lpr {
387
- oldLockProjects = append (oldLockProjects , lockProjects [i ])
484
+ // Generate the old status data and append it
485
+ os := OldStatus {
486
+ ProjectRoot : proj .Ident ().String (),
487
+ Revision : gps .Revision (atRev ),
488
+ Latest : gps .Revision (latestRev ),
489
+ }
490
+ // Getting Constraint
491
+ if pp , has := p .Manifest .Ovr [proj .Ident ().ProjectRoot ]; has && pp .Constraint != nil {
492
+ // manifest has override for project
493
+ os .Constraint = pp .Constraint
494
+ } else if pp , has := p .Manifest .Constraints [proj .Ident ().ProjectRoot ]; has && pp .Constraint != nil {
495
+ // manifest has normal constraint
496
+ os .Constraint = pp .Constraint
497
+ } else {
498
+ os .Constraint = gps .Any ()
499
+ }
500
+ oldStatuses = append (oldStatuses , os )
388
501
}
389
502
}
390
503
391
- for _ , oldLockProject := range oldLockProjects {
392
- ctx .Out .Println (oldLockProject )
504
+ out .OldHeader ()
505
+ for _ , ostat := range oldStatuses {
506
+ out .OldLine (& ostat )
393
507
}
508
+ out .OldFooter ()
394
509
395
510
return nil
396
511
}
0 commit comments