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 }