Separate Go discovery configuration from diagnostics

This commit is contained in:
2026-10-07 00:45:23 +00:00
parent ceb7e2847a
commit e6def4ed7b
4 changed files with 55 additions and 8 deletions

View File

@@ -187,18 +187,18 @@ func discoveryEnvironment() map[string]string {
}
func discover(ctx context.Context, directory string, environment map[string]string, args ...string) ([]byte, error) {
captured := &combinedWriter{}
var configuration, diagnostics bytes.Buffer
err := process.Run(ctx, process.Invocation{
Args: args,
Dir: directory,
Env: environment,
Stdout: captured,
Stderr: captured,
Stdout: &configuration,
Stderr: &diagnostics,
})
contents := captured.Bytes()
contents := configuration.Bytes()
if err != nil {
if len(contents) != 0 {
return contents, fmt.Errorf("%s: %w: %s", strings.Join(args, " "), err, strings.TrimSpace(string(contents)))
if output := strings.TrimSpace(configuration.String() + diagnostics.String()); output != "" {
return contents, fmt.Errorf("%s: %w: %s", strings.Join(args, " "), err, output)
}
return contents, fmt.Errorf("%s: %w", strings.Join(args, " "), err)
}

View File

@@ -47,6 +47,18 @@ func runGoPreparationFixture() int {
return 11
}
switch os.Getenv("RELEASEKIT_GO_FIXTURE_MODE") {
case "discovery":
settings := make(map[string]string)
for _, key := range os.Args[3:] {
settings[key] = os.Getenv(key)
}
settings["GOHOSTOS"] = runtime.GOOS
settings["GOHOSTARCH"] = runtime.GOARCH
fmt.Fprintln(os.Stderr, "fixture discovery diagnostic")
if err := json.NewEncoder(os.Stdout).Encode(settings); err != nil {
return 12
}
return 0
case "fail":
fmt.Fprintln(os.Stderr, "fixture dependency failure")
return 23
@@ -59,6 +71,30 @@ func runGoPreparationFixture() int {
}
}
func TestDiscoveryAcceptsDiagnosticsWithValidConfiguration(t *testing.T) {
repository, _ := installGoPreparationFixture(t)
t.Setenv("RELEASEKIT_GO_FIXTURE_MODE", "discovery")
cache := filepath.Join(t.TempDir(), "cache")
t.Setenv("GOCACHE", cache)
tool, err := New(context.Background(), repository)
if err != nil {
t.Fatalf("New() rejected successful discovery: %v", err)
}
if tool.HostTarget() != (Target{OS: runtime.GOOS, Arch: runtime.GOARCH}) || tool.settings["GOCACHE"] != cache {
t.Fatalf("discovered host=%v cache=%q", tool.HostTarget(), tool.settings["GOCACHE"])
}
}
func TestDiscoveryPreservesFailureDiagnosticsAndCause(t *testing.T) {
repository, _ := installGoPreparationFixture(t)
t.Setenv("RELEASEKIT_GO_FIXTURE_MODE", "fail")
_, err := New(context.Background(), repository)
var exitError *exec.ExitError
if !errors.As(err, &exitError) || exitError.ExitCode() != 23 || !strings.Contains(err.Error(), "fixture dependency failure") {
t.Fatalf("New() error = %v", err)
}
}
func mustGetwd() string {
directory, err := os.Getwd()
if err != nil {