package releasekit import ( "context" "io" internalbuild "gitea.maximumdirect.net/eric/ReleaseKit/internal/build" "gitea.maximumdirect.net/eric/ReleaseKit/internal/candidate" ) // ErrInvalidVersion reports a version that is not stable vMAJOR.MINOR.PATCH. var ErrInvalidVersion = candidate.ErrInvalidVersion // Candidate identifies one committed local source revision selected for // validation. type Candidate struct { RepositoryDir string Commit string Version string } // ReleaseRequest contains the inputs used to validate and optionally build one // local candidate. Remote is retained for publication operations; Check makes // no remote availability claim. type ReleaseRequest struct { RepositoryDir string Product string Version string Remote string // AdditionalChecks optionally runs product checks after the standard suite. AdditionalChecks func(context.Context, Candidate) error Build *BuildSpec // optional selected-target build after validation. Output io.Writer } // Check validates one local, committed release candidate. It requires a clean // worktree and index on main, a committed note matching Product and Version, // and an unused local tag. It always runs the offline Go test suite with the // available compatible local Go toolchain and Go host target, then calls // AdditionalChecks when supplied. If Build selects targets, Check builds them // after validation in temporary storage outside the worktree, then rechecks // branch, HEAD, worktree, index, and local tag state. Success establishes local // candidate evidence only; it does not establish remote availability. func Check(ctx context.Context, request ReleaseRequest) (Candidate, error) { var validate func(context.Context, candidate.Candidate) error if request.AdditionalChecks != nil { validate = func(ctx context.Context, captured candidate.Candidate) error { return request.AdditionalChecks(ctx, Candidate{ RepositoryDir: captured.RepositoryDir, Commit: captured.Commit, Version: captured.Version, }) } } checked, err := candidate.Check(ctx, candidate.Request{ RepositoryDir: request.RepositoryDir, Product: request.Product, Version: request.Version, AdditionalChecks: validate, AfterValidate: internalbuild.CandidateCallback(internalBuildSpec(request.Build), request.Output), Output: request.Output, }) if err != nil { return Candidate{}, err } return Candidate{ RepositoryDir: checked.RepositoryDir, Commit: checked.Commit, Version: checked.Version, }, nil }