Verify build source eligibility after HEAD advancement

This commit is contained in:
2026-10-06 01:13:18 +00:00
parent bb5a8288e6
commit f07545810b
2 changed files with 12 additions and 4 deletions

View File

@@ -475,7 +475,7 @@ func TestBuildSourceEligibilitySurvivesLaterCheckoutCleanup(t *testing.T) {
import("fmt";"os";"gitea.maximumdirect.net/eric/ReleaseKit/buildinfo") import("fmt";"os";"gitea.maximumdirect.net/eric/ReleaseKit/buildinfo")
func main(){ if len(os.Args)>1 && os.Args[1]=="version" {fmt.Println("fixture",buildinfo.Version())} } func main(){ if len(os.Args)>1 && os.Args[1]=="version" {fmt.Println("fixture",buildinfo.Version())} }
` `
for _, mode := range []string{"clean", "dirty before build", "changed during build"} { for _, mode := range []string{"clean", "dirty before build", "changed during build", "commit during build"} {
t.Run(mode, func(t *testing.T) { t.Run(mode, func(t *testing.T) {
repository := newBuildConsumer(t, source) repository := newBuildConsumer(t, source)
writeBuildFixture(t, repository, "docs/releases/v1.2.3.md", "# Fixture v1.2.3\n") writeBuildFixture(t, repository, "docs/releases/v1.2.3.md", "# Fixture v1.2.3\n")
@@ -488,8 +488,14 @@ func main(){ if len(os.Args)>1 && os.Args[1]=="version" {fmt.Println("fixture",b
} }
var writer *sourceChangeWriter var writer *sourceChangeWriter
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: t.TempDir()} 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: t.TempDir()}
if mode == "changed during build" { if mode == "changed during build" || mode == "commit during build" {
writer = &sourceChangeWriter{change: mutate} writer = &sourceChangeWriter{change: func() {
mutate()
if mode == "commit during build" {
buildGit(t, repository, "add", "--all")
buildGit(t, repository, "commit", "-m", "source advanced during compilation")
}
}}
request.Output = writer request.Output = writer
} }
result, err := releasekit.Build(context.Background(), request) result, err := releasekit.Build(context.Background(), request)
@@ -503,6 +509,7 @@ func main(){ if len(os.Args)>1 && os.Args[1]=="version" {fmt.Println("fixture",b
return return
} }
buildGit(t, repository, "restore", "cmd/app/main.go") buildGit(t, repository, "restore", "cmd/app/main.go")
buildGit(t, repository, "checkout", "--detach", "v1.2.3")
delivered, err := releasekit.Deliver(context.Background(), releasekit.DeliveryRequest{RepositoryDir: repository, Product: "Fixture", Version: "v1.2.3", Build: &result}) delivered, err := releasekit.Deliver(context.Background(), releasekit.DeliveryRequest{RepositoryDir: repository, Product: "Fixture", Version: "v1.2.3", Build: &result})
if err == nil || !strings.Contains(err.Error(), "build source") || delivered.State != releasekit.DeliveryNotAttempted { if err == nil || !strings.Contains(err.Error(), "build source") || delivered.State != releasekit.DeliveryNotAttempted {
t.Fatalf("dirty source delivered: %#v %v", delivered, err) t.Fatalf("dirty source delivered: %#v %v", delivered, err)

View File

@@ -91,7 +91,8 @@ the supported API and CLI receipt path.
set only after completed builds observe clean source and unchanged HEAD. Local set only after completed builds observe clean source and unchanged HEAD. Local
dirty builds remain supported; binary delivery rejects their results and dirty builds remain supported; binary delivery rejects their results and
receipts even after checkout cleanup. API tests cover clean, initially dirty, receipts even after checkout cleanup. API tests cover clean, initially dirty,
and changed-during-build source; a CLI regression covers receipt delivery after changed-during-build source, and HEAD advancement; a CLI regression covers
receipt delivery after
cleanup. The offline suite and public boundary checks pass. cleanup. The offline suite and public boundary checks pass.
### R2 — High: Some successful page writes are reported as not attempted ### R2 — High: Some successful page writes are reported as not attempted