Preserve discovery failures for damaged checkouts
This commit is contained in:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user