Preserve build errors and available failure evidence

This commit is contained in:
2026-10-10 14:05:39 +00:00
parent 7555d3e6c9
commit f059fef320
6 changed files with 78 additions and 17 deletions

View File

@@ -2,12 +2,14 @@ package releasekit
import (
"context"
"fmt"
"io"
"gitea.maximumdirect.net/eric/ReleaseKit/internal/artifact"
internalbuild "gitea.maximumdirect.net/eric/ReleaseKit/internal/build"
"gitea.maximumdirect.net/eric/ReleaseKit/internal/git"
"gitea.maximumdirect.net/eric/ReleaseKit/internal/releaseidentity"
"gitea.maximumdirect.net/eric/ReleaseKit/internal/versioncontract"
)
// Target identifies one explicit Go operating-system and architecture pair.
@@ -71,22 +73,36 @@ type BuildResult struct {
// empty target set records source identity without running the Go toolchain.
// Errors return partial build facts in the result.
func Build(ctx context.Context, request BuildRequest) (BuildResult, error) {
public := BuildResult{Version: request.Version}
spec := *internalBuildSpec(&request.Spec)
result := internalbuild.Result{Version: request.Version}
failure := func(err error) (BuildResult, error) {
result.Settings = artifact.NormalizeSettings(spec.MainPackage, spec.BinaryName, spec.Targets)
return publicBuildResult(result), err
}
if !versioncontract.ValidStableVersion(request.Version) {
return failure(fmt.Errorf("%w: %q", ErrInvalidVersion, request.Version))
}
repositoryDir, err := git.RepositoryRoot(ctx, request.RepositoryDir)
if err != nil {
return public, err
return failure(err)
}
result.RepositoryDir = repositoryDir
identity, err := releaseidentity.FromWorkingTree(ctx, repositoryDir, request.ModuleDir, request.Version)
result.ModuleDir, result.ModulePath, result.Tag = identity.ModuleDir, identity.ModulePath, identity.Tag
if err != nil {
return public, err
return failure(err)
}
result, err := internalbuild.BuildResolved(ctx, internalbuild.Request{
result, err = internalbuild.BuildResolved(ctx, internalbuild.Request{
Identity: identity,
Spec: *internalBuildSpec(&request.Spec),
Spec: spec,
OutputDir: request.OutputDir,
Output: request.Output,
})
public = BuildResult{
return publicBuildResult(result), err
}
func publicBuildResult(result internalbuild.Result) BuildResult {
public := BuildResult{
RepositoryDir: result.RepositoryDir,
ModuleDir: result.ModuleDir,
ModulePath: result.ModulePath,
@@ -112,7 +128,7 @@ func Build(ctx context.Context, request BuildRequest) (BuildResult, error) {
SHA256: artifact.SHA256,
})
}
return public, err
return public
}
func internalBuildSpec(spec *BuildSpec) *internalbuild.Spec {