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 Validate 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. If Validate is nil, the offline Go test suite runs. // 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.Validate != nil { validate = func(ctx context.Context, captured candidate.Candidate) error { return request.Validate(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, Validate: 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 }