Regenerate local artifacts and invalidate stale receipts

This commit is contained in:
2026-10-06 00:56:44 +00:00
parent b744346210
commit b4d348dd1f
9 changed files with 90 additions and 40 deletions

View File

@@ -152,38 +152,45 @@ func main() {}
}
}
func TestBuildRejectsUnsafeNameAndPreservesExistingOutput(t *testing.T) {
repository := newBuildConsumer(t, "package main\nfunc main() {}\n")
outputDir := filepath.Join(t.TempDir(), "artifacts")
if err := os.MkdirAll(outputDir, 0o755); err != nil {
func TestBuildRegeneratesOwnedOutputsAndPreservesUnrelatedFiles(t *testing.T) {
const source = `package main
import("fmt";"gitea.maximumdirect.net/eric/ReleaseKit/buildinfo")
func main(){fmt.Println("fixture",buildinfo.Version())}
`
repository := newBuildConsumer(t, source)
outputDir := t.TempDir()
unrelated := filepath.Join(outputDir, "keep.txt")
if err := os.WriteFile(unrelated, []byte("keep this file"), 0600); err != nil {
t.Fatal(err)
}
ownedPath := filepath.Join(outputDir, "fixture-v1.2.3-linux-amd64")
if err := os.WriteFile(ownedPath, []byte("keep this file"), 0o600); err != nil {
request := releasekit.BuildRequest{RepositoryDir: repository, Version: "v1.2.3", Spec: releasekit.BuildSpec{MainPackage: "./cmd/app", BinaryName: "fixture", Targets: []releasekit.Target{{OS: runtime.GOOS, Arch: runtime.GOARCH}}}, OutputDir: outputDir}
unsafe := request
unsafe.Spec.BinaryName = "../unsafe"
if _, err := releasekit.Build(context.Background(), unsafe); err == nil {
t.Fatal("unsafe binary name accepted")
}
first, err := releasekit.Build(context.Background(), request)
if err != nil {
t.Fatal(err)
}
request := releasekit.BuildRequest{
RepositoryDir: repository,
Version: "v1.2.3",
Spec: releasekit.BuildSpec{
MainPackage: "./cmd/app",
BinaryName: "fixture",
Targets: []releasekit.Target{{OS: "linux", Arch: "amd64"}},
},
OutputDir: outputDir,
repeated, err := releasekit.Build(context.Background(), request)
if err != nil {
t.Fatal(err)
}
unsafeRequest := request
unsafeRequest.Spec.BinaryName = "../unsafe"
if result, err := releasekit.Build(context.Background(), unsafeRequest); err == nil || !strings.Contains(err.Error(), "unsafe binary name") {
t.Fatalf("Build() result = %#v, error = %v; expected unsafe-name failure", result, err)
if repeated.Artifacts[0].SHA256 != first.Artifacts[0].SHA256 {
t.Fatal("identical build changed output")
}
request.Spec.BinaryName = "fixture"
if _, err := releasekit.Build(context.Background(), request); err == nil || !strings.Contains(err.Error(), "already exists") {
t.Fatalf("Build() error = %v, want existing-output failure", err)
writeBuildFixture(t, repository, "cmd/app/main.go", source+"\nfunc init(){if len([]byte(buildinfo.Version()))==0 {panic(\"changed build\")}}\n")
changed, err := releasekit.Build(context.Background(), request)
if err != nil {
t.Fatal(err)
}
contents, err := os.ReadFile(ownedPath)
if err != nil || string(contents) != "keep this file" {
t.Fatalf("caller output = %q, error = %v", contents, err)
if changed.Artifacts[0].SHA256 == first.Artifacts[0].SHA256 {
t.Fatal("changed source did not regenerate binary")
}
content, err := os.ReadFile(unrelated)
if err != nil || string(content) != "keep this file" {
t.Fatalf("unrelated file=%q %v", content, err)
}
}