@@ -47,49 +47,52 @@ func (f *Format) Format(ctx context.Context, packages []*models.PackageInsights)
47
47
return nil
48
48
}
49
49
50
- func (f * Format ) FormatWithPath (ctx context.Context , packages []* models.PackageInsights , pathAssociations map [string ][]models.BranchInfo ) error {
50
+ func (f * Format ) FormatWithPath (ctx context.Context , packages []* models.PackageInsights , pathAssociations map [string ][]* models.RepoInfo ) error {
51
51
failures := map [string ]int {}
52
52
rules := map [string ]results.Rule {}
53
53
54
54
for _ , pkg := range packages {
55
- findings := map [string ][] string {}
55
+ findings := make ( map [string ]map [ string ] bool )
56
56
for _ , finding := range pkg .FindingsResults .Findings {
57
- failures [finding .RuleId ]++
58
57
filename := filepath .Base (finding .Meta .Path )
59
58
filename = strings .TrimSuffix (filename , filepath .Ext (filename ))
60
- findings [filename ] = append (findings [filename ], finding .RuleId )
59
+ if _ , ok := findings [filename ]; ! ok {
60
+ findings [filename ] = make (map [string ]bool )
61
+ }
62
+ if _ , ok := findings [filename ][finding.RuleId ]; ! ok {
63
+ failures [finding .RuleId ]++
64
+ }
65
+ findings [filename ][finding.RuleId ] = true
61
66
}
62
67
63
68
for _ , rule := range pkg .FindingsResults .Rules {
64
69
rules [rule .Id ] = rule
65
70
}
66
71
67
- _ = f .printFindingsPerWorkflow (os .Stdout , findings , pkg . Purl , pathAssociations )
72
+ _ = f .printFindingsPerWorkflow (os .Stdout , findings , pathAssociations )
68
73
}
69
74
printSummaryTable (os .Stdout , failures , rules )
70
75
71
76
return nil
72
77
}
73
78
74
- func (f * Format ) printFindingsPerWorkflow (out io.Writer , results map [string ][] string , purlStr string , pathAssociations map [string ][]models.BranchInfo ) error {
79
+ func (f * Format ) printFindingsPerWorkflow (out io.Writer , results map [string ]map [ string ] bool , pathAssociations map [string ][]* models.RepoInfo ) error {
75
80
// Skip rules with no findings.
76
81
table := tablewriter .NewWriter (out )
77
82
table .SetAutoMergeCells (true )
78
- table .SetHeader ([]string {"Workflow sha" , "Rule" , "Branch " , "URL" })
83
+ table .SetHeader ([]string {"Workflow sha" , "Rule" , "Location " , "URL" })
79
84
80
- purl , err := models .NewPurl (purlStr )
81
- if err != nil {
82
- return fmt .Errorf ("error creating purl: %w" , err )
83
- }
84
- for blobsha , branchInfos := range pathAssociations {
85
+ for blobsha , repoInfos := range pathAssociations {
85
86
findings := results [blobsha ]
86
87
if len (findings ) == 0 {
87
88
continue
88
89
}
89
90
largestElement := len (findings )
90
91
sumPath := 0
91
- for _ , branchInfo := range branchInfos {
92
- sumPath += len (branchInfo .FilePath )
92
+ for _ , repoInfo := range repoInfos {
93
+ for _ , branchInfo := range repoInfo .BranchInfos {
94
+ sumPath += len (branchInfo .FilePath )
95
+ }
93
96
}
94
97
blobshaTable := make ([][]string , max (largestElement , sumPath ))
95
98
for i := range blobshaTable {
@@ -98,19 +101,35 @@ func (f *Format) printFindingsPerWorkflow(out io.Writer, results map[string][]st
98
101
99
102
blobshaTable [0 ][0 ] = blobsha
100
103
101
- for i , finding := range findings {
104
+ // Extract and sort the keys of the findings map
105
+ sortedFindings := make ([]string , 0 , len (findings ))
106
+ for finding := range findings {
107
+ sortedFindings = append (sortedFindings , finding )
108
+ }
109
+ sort .Strings (sortedFindings )
110
+
111
+ // Iterate over the sorted keys
112
+ i := 0
113
+ for _ , finding := range sortedFindings {
102
114
blobshaTable [i ][1 ] = finding
115
+ i ++
103
116
}
104
117
105
118
index := 0
106
- for _ , branchInfo := range branchInfos {
107
- for j , path := range branchInfo .FilePath {
108
- if j == 0 {
109
- blobshaTable [index ][2 ] = branchInfo .BranchName
119
+ for _ , repoInfo := range repoInfos {
120
+ purl , err := models .NewPurl (repoInfo .Purl )
121
+ if err != nil {
122
+ return fmt .Errorf ("failed to parse purl: %w" , err )
123
+ }
124
+ for _ , branchInfo := range repoInfo .BranchInfos {
125
+ for j , path := range branchInfo .FilePath {
126
+ if j == 0 {
127
+ blobshaTable [index ][2 ] = repoInfo .RepoName + "/" + branchInfo .BranchName
128
+ }
129
+
130
+ blobshaTable [index ][3 ] = purl .Link () + "/tree/" + branchInfo .BranchName + "/" + path
131
+ index += 1
110
132
}
111
-
112
- blobshaTable [index ][3 ] = purl .Link () + "/tree/" + branchInfo .BranchName + "/" + path
113
- index += 1
114
133
}
115
134
}
116
135
0 commit comments