// 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 }