constellation/hack/bazel-deps-mirror/internal/issues/issues.go
Malte Poll 827c4f548d
bazel: deps mirror (#1522)
bazel-deps-mirror is an internal tools used to upload external dependencies
that are referenced in the Bazel WORKSPACE to the Edgeless Systems' mirror.

It also normalizes deps rules.

* hack: add tool to mirror Bazel dependencies
* hack: bazel-deps-mirror tests
* bazel: add deps mirror commands
* ci: upload Bazel dependencies on renovate PRs
* update go mod
* run deps_mirror_upload


Signed-off-by: Paul Meyer <49727155+katexochen@users.noreply.github.com>
Co-authored-by: Paul Meyer <49727155+katexochen@users.noreply.github.com>
2023-03-30 09:41:56 +02:00

89 lines
2.0 KiB
Go

/*
Copyright (c) Edgeless Systems GmbH
SPDX-License-Identifier: AGPL-3.0-only
*/
// package issues can store and report issues found during the bazel-deps-mirror process.
package issues
import (
"fmt"
"io"
"sort"
)
// Map is a map of issues arranged by path => rulename => issues.
type Map map[string]map[string][]error
// New creates a new Map.
func New() Map {
return make(map[string]map[string][]error)
}
// Set sets all issues for a file.
func (m Map) Set(file string, issues ByFile) {
m[file] = issues
}
// Report prints all issues to a writer in a human-readable format.
func (m Map) Report(w io.Writer) {
files := make([]string, 0, len(m))
for f := range m {
files = append(files, f)
}
sort.Strings(files)
for _, file := range files {
rules := make([]string, 0, len(m[file]))
for r := range m[file] {
rules = append(rules, r)
}
sort.Strings(rules)
fmt.Fprintf(w, "File %s (%d issues total):\n", file, m.IssuesPerFile(file))
for _, rule := range rules {
ruleIssues := m[file][rule]
if len(ruleIssues) == 0 {
continue
}
fmt.Fprintf(w, " Rule %s (%d issues total):\n", rule, m.IssuesPerRule(file, rule))
for _, issue := range ruleIssues {
fmt.Fprintf(w, " %s\n", issue)
}
}
}
}
// FileHasIssues returns true if the file has any issues.
func (m Map) FileHasIssues(file string) bool {
return m[file] != nil
}
// IssuesPerFile returns the number of issues for a file.
func (m Map) IssuesPerFile(file string) int {
sum := 0
for _, ruleIssues := range m[file] {
sum += len(ruleIssues)
}
return sum
}
// IssuesPerRule returns the number of issues for a rule.
func (m Map) IssuesPerRule(file string, rule string) int {
return len(m[file][rule])
}
// ByFile is a map of issues belonging to one file arranged by rulename => issues.
type ByFile map[string][]error
// NewByFile creates a new ByFile.
func NewByFile() ByFile {
return make(map[string][]error)
}
// Add adds one or more issues belonging to a rule.
func (m ByFile) Add(rule string, issues ...error) {
m[rule] = append(m[rule], issues...)
}