Preserve child working directory in environment overlays

This commit is contained in:
2026-11-02 11:36:40 +00:00
parent 31f9e48219
commit a2d75c462c
4 changed files with 106 additions and 6 deletions

View File

@@ -14,10 +14,54 @@ import (
releasekit "go.maximumdirect.net/releasekit"
"go.maximumdirect.net/releasekit/internal/git"
"go.maximumdirect.net/releasekit/internal/gotool"
)
const releaseNote = "# Sample App v1.2.3\n\nA source release.\n\nUpgrade notes stay intact.\n"
func TestPublishPreservesHookDirectoryEnvironment(t *testing.T) {
if runtime.GOOS == "windows" {
t.Skip("directory-derived PWD is a POSIX behavior")
}
repo := newPublishFixture(t)
marker := filepath.Join(t.TempDir(), "hook-ran")
t.Setenv("RELEASEKIT_HOOK_MARKER", marker)
helperDir := t.TempDir()
writeFile(t, helperDir, "main.go", `package main
import "os"
func main() {
cwd, err := os.Getwd()
if err != nil || os.Getenv("PWD") != cwd {
os.Stderr.WriteString("pre-push PWD does not identify the selected repository\n")
os.Exit(1)
}
if err := os.WriteFile(os.Getenv("RELEASEKIT_HOOK_MARKER"), []byte("checked"), 0600); err != nil {
os.Exit(2)
}
}
`)
hooks := filepath.Join(repo.work, ".git", "hooks")
if err := os.MkdirAll(hooks, 0o700); err != nil {
t.Fatal(err)
}
gitRun(t, repo.work, "config", "core.hooksPath", hooks)
tool, err := gotool.New(t.Context(), repo.work)
if err != nil {
t.Fatal(err)
}
if err := tool.Run(t.Context(), repo.work, gotool.Static, tool.HostTarget(), nil,
"build", "-o", filepath.Join(hooks, "pre-push"), filepath.Join(helperDir, "main.go")); err != nil {
t.Fatal(err)
}
result, err := releasekit.Publish(t.Context(), releasekit.ReleaseRequest{RepositoryDir: repo.work, Product: "Sample App", Version: "v1.2.3"})
if err != nil || result.State != releasekit.PublicationPublished {
t.Fatalf("publication with directory-aware hook = %#v, %v", result, err)
}
if data, err := os.ReadFile(marker); err != nil || string(data) != "checked" {
t.Fatalf("pre-push hook observation = %q, %v", data, err)
}
}
func TestCheckRejectsInvalidDerivedTagBeforeValidation(t *testing.T) {
for _, module := range []string{"module space", "module.lock"} {
t.Run(module, func(t *testing.T) {