Skip to content
This repository was archived by the owner on Mar 27, 2024. It is now read-only.

Commit 80a0a96

Browse files
committed
Refactoring to make output additions more clearly navigable
1 parent 04ac74f commit 80a0a96

File tree

6 files changed

+409
-429
lines changed

6 files changed

+409
-429
lines changed

cmd/root.go

Lines changed: 31 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -116,31 +116,8 @@ func diffImages(image1Arg, image2Arg string, diffArgs []string) error {
116116

117117
req := differs.DiffRequest{image1, image2, diffTypes}
118118
if diffs, err := req.GetDiff(); err == nil {
119-
// Outputs diff results in alphabetical order by differ name
120-
sortedTypes := []string{}
121-
for name := range diffs {
122-
sortedTypes = append(sortedTypes, name)
123-
}
124-
sort.Strings(sortedTypes)
125119
glog.Info("Retrieving diffs")
126-
diffResults := make([]interface{}, len(diffs))
127-
for i, diffType := range sortedTypes {
128-
diff := diffs[diffType]
129-
if json {
130-
diffResults[i] = diff.GetStruct()
131-
} else {
132-
err = diff.OutputText(diffType)
133-
if err != nil {
134-
glog.Error(err)
135-
}
136-
}
137-
}
138-
if json {
139-
err = utils.JSONify(diffResults)
140-
if err != nil {
141-
glog.Error(err)
142-
}
143-
}
120+
outputResults(diffs)
144121
if !save {
145122
cleanupImage(image1)
146123
cleanupImage(image2)
@@ -175,31 +152,8 @@ func analyzeImage(imageArg string, analyzerArgs []string) error {
175152

176153
req := differs.SingleRequest{image, analyzeTypes}
177154
if analyses, err := req.GetAnalysis(); err == nil {
178-
// Outputs analysis results in alphabetical order by differ name
179-
sortedTypes := []string{}
180-
for name := range analyses {
181-
sortedTypes = append(sortedTypes, name)
182-
}
183-
sort.Strings(sortedTypes)
184-
glog.Info("Retrieving diffs")
185-
analyzeResults := make([]interface{}, len(analyses))
186-
for i, analyzeType := range sortedTypes {
187-
analysis := analyses[analyzeType]
188-
if json {
189-
analyzeResults[i] = analysis.GetStruct()
190-
} else {
191-
err = analysis.OutputText(analyzeType)
192-
if err != nil {
193-
glog.Error(err)
194-
}
195-
}
196-
}
197-
if json {
198-
err = utils.JSONify(analyzeResults)
199-
if err != nil {
200-
glog.Error(err)
201-
}
202-
}
155+
glog.Info("Retrieving analyses")
156+
outputResults(analyses)
203157
if !save {
204158
cleanupImage(image)
205159
} else {
@@ -215,6 +169,34 @@ func analyzeImage(imageArg string, analyzerArgs []string) error {
215169
return nil
216170
}
217171

172+
func outputResults(resultMap map[string]utils.Result) {
173+
// Outputs diff/analysis results in alphabetical order by analyzer name
174+
sortedTypes := []string{}
175+
for analyzerType := range resultMap {
176+
sortedTypes = append(sortedTypes, analyzerType)
177+
}
178+
sort.Strings(sortedTypes)
179+
180+
results := make([]interface{}, len(resultMap))
181+
for i, analyzerType := range sortedTypes {
182+
result := resultMap[analyzerType]
183+
if json {
184+
results[i] = result.OutputStruct()
185+
} else {
186+
err := result.OutputText(analyzerType)
187+
if err != nil {
188+
glog.Error(err)
189+
}
190+
}
191+
}
192+
if json {
193+
err := utils.JSONify(results)
194+
if err != nil {
195+
glog.Error(err)
196+
}
197+
}
198+
}
199+
218200
func cleanupImage(image utils.Image) {
219201
if !reflect.DeepEqual(image, (utils.Image{})) {
220202
glog.Infof("Removing image filesystem directory %s from system", image.FSPath)

utils/analyze_output_utils.go

Lines changed: 5 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,7 @@
11
package utils
22

3-
import (
4-
"sort"
5-
6-
"code.cloudfoundry.org/bytefmt"
7-
)
8-
9-
var SortSize bool
10-
113
type Result interface {
12-
GetStruct() interface{}
4+
OutputStruct() interface{}
135
OutputText(resultType string) error
146
}
157

@@ -21,7 +13,7 @@ type AnalyzeResult struct {
2113

2214
type ListAnalyzeResult AnalyzeResult
2315

24-
func (r ListAnalyzeResult) GetStruct() interface{} {
16+
func (r ListAnalyzeResult) OutputStruct() interface{} {
2517
return r
2618
}
2719

@@ -32,7 +24,7 @@ func (r ListAnalyzeResult) OutputText(resultType string) error {
3224

3325
type MultiVersionPackageAnalyzeResult AnalyzeResult
3426

35-
func (r MultiVersionPackageAnalyzeResult) GetStruct() interface{} {
27+
func (r MultiVersionPackageAnalyzeResult) OutputStruct() interface{} {
3628
analysis := r.Analysis.(map[string]map[string]PackageInfo)
3729
analysisOutput := getMultiVersionPackageOutput(analysis)
3830
output := struct {
@@ -66,7 +58,7 @@ func (r MultiVersionPackageAnalyzeResult) OutputText(resultType string) error {
6658

6759
type SingleVersionPackageAnalyzeResult AnalyzeResult
6860

69-
func (r SingleVersionPackageAnalyzeResult) GetStruct() interface{} {
61+
func (r SingleVersionPackageAnalyzeResult) OutputStruct() interface{} {
7062
analysis := r.Analysis.(map[string]PackageInfo)
7163
analysisOutput := getSingleVersionPackageOutput(analysis)
7264
output := struct {
@@ -105,56 +97,6 @@ type PackageOutput struct {
10597
Size int64
10698
}
10799

108-
type packageBy func(p1, p2 *PackageOutput) bool
109-
110-
func (by packageBy) Sort(packages []PackageOutput) {
111-
ps := &packageSorter{
112-
packages: packages,
113-
by: by,
114-
}
115-
sort.Sort(ps)
116-
}
117-
118-
type packageSorter struct {
119-
packages []PackageOutput
120-
by func(p1, p2 *PackageOutput) bool
121-
}
122-
123-
func (s *packageSorter) Len() int {
124-
return len(s.packages)
125-
}
126-
127-
func (s *packageSorter) Less(i, j int) bool {
128-
return s.by(&s.packages[i], &s.packages[j])
129-
}
130-
131-
func (s *packageSorter) Swap(i, j int) {
132-
s.packages[i], s.packages[j] = s.packages[j], s.packages[i]
133-
}
134-
135-
// If packages have the same name, means they exist where multiple version of the same package are allowed,
136-
// so sort by version. If they have the same version, then sort by size.
137-
var packageNameSort = func(p1, p2 *PackageOutput) bool {
138-
if p1.Name == p2.Name {
139-
if p1.Version == p2.Version {
140-
return p1.Size > p2.Size
141-
}
142-
return p1.Version < p2.Version
143-
}
144-
return p1.Name < p2.Name
145-
}
146-
147-
// If packages have the same size, sort by name. If they are two versions of the same package, sort by version.
148-
var packageSizeSort = func(p1, p2 *PackageOutput) bool {
149-
if p1.Size == p2.Size {
150-
if p1.Name == p2.Name {
151-
return p1.Version < p2.Version
152-
}
153-
return p1.Name < p2.Name
154-
}
155-
return p1.Size > p2.Size
156-
}
157-
158100
func getSingleVersionPackageOutput(packageMap map[string]PackageInfo) []PackageOutput {
159101
packages := []PackageOutput{}
160102
for name, info := range packageMap {
@@ -185,33 +127,9 @@ func getMultiVersionPackageOutput(packageMap map[string]map[string]PackageInfo)
185127
return packages
186128
}
187129

188-
type StrPackageOutput struct {
189-
Name string
190-
Path string
191-
Version string
192-
Size string
193-
}
194-
195-
func stringifySize(size int64) string {
196-
strSize := "unknown"
197-
if size != -1 {
198-
strSize = bytefmt.ByteSize(uint64(size))
199-
}
200-
return strSize
201-
}
202-
203-
func stringifyPackages(packages []PackageOutput) []StrPackageOutput {
204-
strPackages := []StrPackageOutput{}
205-
for _, pack := range packages {
206-
strSize := stringifySize(pack.Size)
207-
strPackages = append(strPackages, StrPackageOutput{pack.Name, pack.Path, pack.Version, strSize})
208-
}
209-
return strPackages
210-
}
211-
212130
type FileAnalyzeResult AnalyzeResult
213131

214-
func (r FileAnalyzeResult) GetStruct() interface{} {
132+
func (r FileAnalyzeResult) OutputStruct() interface{} {
215133
analysis := r.Analysis.([]DirectoryEntry)
216134
if SortSize {
217135
directoryBy(directorySizeSort).Sort(analysis)
@@ -242,57 +160,3 @@ func (r FileAnalyzeResult) OutputText(analyzeType string) error {
242160
}
243161
return TemplateOutput(strResult, "FileAnalyze")
244162
}
245-
246-
type directoryBy func(e1, e2 *DirectoryEntry) bool
247-
248-
func (by directoryBy) Sort(entries []DirectoryEntry) {
249-
ds := &directorySorter{
250-
entries: entries,
251-
by: by,
252-
}
253-
sort.Sort(ds)
254-
}
255-
256-
type directorySorter struct {
257-
entries []DirectoryEntry
258-
by func(p1, p2 *DirectoryEntry) bool
259-
}
260-
261-
func (s *directorySorter) Len() int {
262-
return len(s.entries)
263-
}
264-
265-
func (s *directorySorter) Less(i, j int) bool {
266-
return s.by(&s.entries[i], &s.entries[j])
267-
}
268-
269-
func (s *directorySorter) Swap(i, j int) {
270-
s.entries[i], s.entries[j] = s.entries[j], s.entries[i]
271-
}
272-
273-
// If packages have the same name, means they exist where multiple version of the same package are allowed,
274-
// so sort by version. If they have the same version, then sort by size.
275-
var directoryNameSort = func(e1, e2 *DirectoryEntry) bool {
276-
return e1.Name < e2.Name
277-
}
278-
279-
// If packages have the same size, sort by name. If they are two versions of the same package, sort by version.
280-
var directorySizeSort = func(e1, e2 *DirectoryEntry) bool {
281-
if e1.Size == e2.Size {
282-
return e1.Name < e2.Name
283-
}
284-
return e1.Size > e2.Size
285-
}
286-
287-
type StrDirectoryEntry struct {
288-
Name string
289-
Size string
290-
}
291-
292-
func stringifyDirectoryEntries(entries []DirectoryEntry) (strEntries []StrDirectoryEntry) {
293-
for _, entry := range entries {
294-
strEntry := StrDirectoryEntry{Name: entry.Name, Size: stringifySize(entry.Size)}
295-
strEntries = append(strEntries, strEntry)
296-
}
297-
return
298-
}

0 commit comments

Comments
 (0)