Preserve discovery failures for damaged checkouts

This commit is contained in:
2026-11-01 21:53:40 +00:00
parent 5d5653bfc3
commit 66f5884ab4
5 changed files with 176 additions and 12 deletions

View File

@@ -308,6 +308,53 @@ func TestPrepareBuildDependenciesWithoutGit(t *testing.T) {
}
}
func TestPrepareBuildDependenciesRejectsDamagedCheckout(t *testing.T) {
repo := t.TempDir()
child := filepath.Join(repo, "child")
writeBuildFixture(t, repo, "go.mod", "module example.com/root\n\ngo 1.26.0\n")
writeBuildFixture(t, repo, "child/go.mod", "module example.com/child\n\ngo 1.26.0\n")
buildGit(t, repo, "init", "-b", "main")
buildGit(t, repo, "config", "user.name", "Test")
buildGit(t, repo, "config", "user.email", "test@example.invalid")
buildGit(t, repo, "add", ".")
buildGit(t, repo, "commit", "-m", "create module fixture")
bin := t.TempDir()
marker := filepath.Join(t.TempDir(), "go-directory")
if err := os.WriteFile(filepath.Join(bin, "go"), []byte("#!/bin/sh\nprintf '%s' \"$PWD\" > \"$PREPARE_DIR_MARKER\"\n"), 0o755); err != nil {
t.Fatal(err)
}
t.Setenv("PATH", bin+string(os.PathListSeparator)+os.Getenv("PATH"))
t.Setenv("PREPARE_DIR_MARKER", marker)
request := releasekit.DependencyPreparationRequest{RepositoryDir: child}
if err := releasekit.PrepareBuildDependencies(t.Context(), request); err != nil {
t.Fatal(err)
}
if got, err := os.ReadFile(marker); err != nil || string(got) != repo {
t.Fatalf("healthy checkout selected %q, error %v; want %q", got, err, repo)
}
if err := os.Remove(marker); err != nil {
t.Fatal(err)
}
if err := os.Rename(filepath.Join(repo, ".git", "HEAD"), filepath.Join(t.TempDir(), "saved-head")); err != nil {
t.Fatal(err)
}
err := releasekit.PrepareBuildDependencies(t.Context(), request)
var exitErr *exec.ExitError
if !errors.As(err, &exitErr) || exitErr.ExitCode() != 128 {
t.Fatalf("damaged checkout error = %v; want original Git failure", err)
}
if _, err := os.Stat(marker); !os.IsNotExist(err) {
t.Fatalf("Go ran after damaged checkout discovery: %v", err)
}
request.RepositoryDir = t.TempDir()
if err := releasekit.PrepareBuildDependencies(t.Context(), request); err != nil {
t.Fatalf("standalone preparation: %v", err)
}
if got, err := os.ReadFile(marker); err != nil || string(got) != request.RepositoryDir {
t.Fatalf("standalone selected %q, error %v; want %q", got, err, request.RepositoryDir)
}
}
func publishPreparationTag(t *testing.T, repository string) string {
t.Helper()
return publishPreparationTagNamed(t, repository, "v1.2.3")