93 lines
2.6 KiB
Go
93 lines
2.6 KiB
Go
// Package validation owns the shared checks run against a captured candidate.
|
|
package validation
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"strings"
|
|
|
|
"gitea.maximumdirect.net/eric/ReleaseKit/internal/gotool"
|
|
)
|
|
|
|
// Settings selects shared validation behavior.
|
|
type Settings struct {
|
|
Race bool
|
|
FullVet bool
|
|
CompileTargets []Target
|
|
}
|
|
|
|
// Target selects one package-compilation target.
|
|
type Target struct {
|
|
OS string
|
|
Arch string
|
|
}
|
|
|
|
// Request identifies the captured source and output used by shared validation.
|
|
type Request struct {
|
|
RepositoryDir string
|
|
Commit string
|
|
Output io.Writer
|
|
Settings Settings
|
|
}
|
|
|
|
// ReadCandidateTree loads the committed-file inventory when a selected check
|
|
// needs file-oriented input.
|
|
func (request Request) ReadCandidateTree(ctx context.Context) (*CandidateTree, error) {
|
|
return ReadCandidateTree(ctx, request.RepositoryDir, request.Commit)
|
|
}
|
|
|
|
// Run executes shared validation for the captured candidate.
|
|
func Run(ctx context.Context, request Request) error {
|
|
for _, target := range request.Settings.CompileTargets {
|
|
if strings.TrimSpace(target.OS) == "" || strings.TrimSpace(target.Arch) == "" || strings.Contains(target.OS, "/") || strings.Contains(target.Arch, "/") {
|
|
return &Failure{
|
|
Check: PackageCompile,
|
|
Findings: []Finding{{
|
|
Target: target.OS + "/" + target.Arch,
|
|
Message: "target must be one complete GOOS/GOARCH pair",
|
|
}},
|
|
}
|
|
}
|
|
}
|
|
tool, err := gotool.New(ctx, request.RepositoryDir)
|
|
if err != nil {
|
|
return &Failure{Check: GoTest, Cause: err}
|
|
}
|
|
args := []string{"test", "-mod=readonly", "-count=1"}
|
|
if request.Settings.Race {
|
|
args = append(args, "-race")
|
|
}
|
|
if request.Settings.FullVet {
|
|
args = append(args, "-vet=off")
|
|
}
|
|
args = append(args, "./...")
|
|
_, err = tool.Run(ctx, request.RepositoryDir, gotool.Native, gotool.Target{}, request.Output, args...)
|
|
if err != nil {
|
|
return &Failure{Check: GoTest, Cause: err}
|
|
}
|
|
if request.Settings.FullVet {
|
|
_, err = tool.Run(ctx, request.RepositoryDir, gotool.Native, gotool.Target{}, request.Output, "vet", "-mod=readonly", "./...")
|
|
if err != nil {
|
|
return &Failure{Check: GoVet, Cause: err}
|
|
}
|
|
}
|
|
for _, target := range request.Settings.CompileTargets {
|
|
selected := gotool.Target{OS: target.OS, Arch: target.Arch}
|
|
_, err = tool.Run(ctx, request.RepositoryDir, gotool.Static, selected, request.Output,
|
|
"build", "-mod=readonly", "-o", os.DevNull, "./...")
|
|
if err != nil {
|
|
return &Failure{
|
|
Check: PackageCompile,
|
|
Findings: []Finding{{
|
|
Target: fmt.Sprintf("%s/%s", target.OS, target.Arch),
|
|
Message: "package compilation failed",
|
|
}},
|
|
Cause: err,
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|