in internal/report/lint.go [169:283]
func (r *Report) Lint() []string {
var issues []string
addIssue := func(iss string) {
issues = append(issues, iss)
}
var importPath string
if !stdlib.Contains(r.Module) {
if r.Module == "" {
addIssue("missing module")
}
if r.Module != "" && r.Package == r.Module {
addIssue("package is redundant and can be removed")
}
if r.Package != "" && !strings.HasPrefix(r.Package, r.Module) {
addIssue("module must be a prefix of package")
}
if r.Package == "" {
importPath = r.Module
} else {
importPath = r.Package
}
if r.Module != "" && importPath != "" {
if err := checkModVersions(r.Module, r.Versions); err != nil {
addIssue(err.Error())
}
if err := module.CheckImportPath(importPath); err != nil {
addIssue(err.Error())
}
}
for _, v := range r.Versions {
if v.Introduced != "" && !strings.HasPrefix(v.Introduced, "v") {
addIssue(fmt.Sprintf("invalid semantic version: %q", v.Introduced))
}
if v.Fixed != "" && !strings.HasPrefix(v.Fixed, "v") {
addIssue(fmt.Sprintf("invalid semantic version: %q", v.Fixed))
}
}
} else {
if r.Package == "" {
addIssue("missing package")
}
for _, v := range r.Versions {
if v.Introduced != "" && !strings.HasPrefix(v.Introduced, "go") {
addIssue(fmt.Sprintf("invalid Go version: %q", v.Introduced))
}
if v.Fixed != "" && !strings.HasPrefix(v.Fixed, "go") {
addIssue(fmt.Sprintf("invalid Go version: %q", v.Fixed))
}
}
}
for _, additionalPackage := range r.AdditionalPackages {
var additionalImportPath string
if additionalPackage.Module == "" {
addIssue("missing additional_package.module")
}
if additionalPackage.Package == additionalPackage.Module {
addIssue("package is redundant and can be removed")
}
if !stdlib.Contains(additionalPackage.Module) && additionalPackage.Package != "" && !strings.HasPrefix(additionalPackage.Package, additionalPackage.Module) {
addIssue("additional_package.module must be a prefix of additional_package.package")
}
if additionalPackage.Package == "" {
additionalImportPath = additionalPackage.Module
} else {
additionalImportPath = additionalPackage.Package
}
if err := module.CheckImportPath(additionalImportPath); err != nil {
addIssue(err.Error())
}
if !stdlib.Contains(r.Module) {
if err := checkModVersions(additionalPackage.Module, additionalPackage.Versions); err != nil {
addIssue(err.Error())
}
}
}
if r.Description == "" {
addIssue("missing description")
}
if r.LastModified != nil && r.LastModified.Before(r.Published) {
addIssue("last_modified is before published")
}
if len(r.CVEs) > 0 && r.CVEMetadata != nil && r.CVEMetadata.ID != "" {
// TODO: may just want to use one of these? :shrug:
addIssue("only one of cve and cve_metadata.id should be present")
}
for _, cve := range r.CVEs {
if !cveRegex.MatchString(cve) {
addIssue("malformed cve identifier")
}
}
if r.CVEMetadata != nil {
if r.CVEMetadata.ID == "" {
addIssue("cve_metadata.id is required")
}
if !cveRegex.MatchString(r.CVEMetadata.ID) {
addIssue("malformed cve_metadata.id identifier")
}
}
links := append(r.Links.Context, r.Links.Commit, r.Links.PR)
for _, l := range links {
if !isValidURL(l) {
addIssue(fmt.Sprintf("%q should be %q", l, fixURL(l)))
}
}
return issues
}