Files
ReleaseKit/check.go

65 lines
2.0 KiB
Go

package releasekit
import (
"context"
"io"
"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 local inputs used by Check. 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
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.
// It rechecks branch, HEAD, worktree, index, and local tag state after
// validation. 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,
Output: request.Output,
})
if err != nil {
return Candidate{}, err
}
return Candidate{
RepositoryDir: checked.RepositoryDir,
Commit: checked.Commit,
Version: checked.Version,
}, nil
}