Files
releasekit/internal/delivery/assets.go

55 lines
1.8 KiB
Go

package delivery
import (
"fmt"
"os"
"path/filepath"
"go.maximumdirect.net/releasekit/internal/artifact"
internalbuild "go.maximumdirect.net/releasekit/internal/build"
)
func declaredBuildAssets(result internalbuild.Result) ([]artifact.ExpectedAsset, error) {
settings := result.Settings
if len(settings.Targets) == 0 {
if len(result.Artifacts) != 0 {
return nil, fmt.Errorf("source-only build result contains artifacts")
}
return nil, nil
}
declarations := make([]artifact.Declaration, 0, len(result.Artifacts))
for _, built := range result.Artifacts {
declarations = append(declarations, artifact.Declaration{Target: built.Target, Filename: built.Filename})
}
if err := artifact.ValidateDeclarations(settings.BinaryName, result.Version, settings.Targets, declarations); err != nil {
return nil, fmt.Errorf("build result: %w", err)
}
assets := make([]artifact.ExpectedAsset, 0, len(result.Artifacts)+1)
for _, builtArtifact := range result.Artifacts {
if filepath.Base(builtArtifact.Path) != builtArtifact.Filename {
return nil, fmt.Errorf("build artifact path %q does not end with filename %q", builtArtifact.Path, builtArtifact.Filename)
}
info, err := os.Stat(builtArtifact.Path)
if err != nil {
return nil, fmt.Errorf("inspect build artifact %q: %w", builtArtifact.Filename, err)
}
if !info.Mode().IsRegular() {
return nil, fmt.Errorf("build artifact %q is not a regular file", builtArtifact.Filename)
}
assets = append(assets, artifact.ExpectedAsset{
Filename: builtArtifact.Filename,
SHA256: builtArtifact.SHA256,
Size: info.Size(),
Path: builtArtifact.Path,
})
}
manifest, err := artifact.BuildManifest(assets)
if err != nil {
return nil, fmt.Errorf("build checksum manifest: %w", err)
}
if manifest.Filename != "" {
assets = append(assets, manifest)
}
return assets, nil
}