Verify record storage preserves whitespace in Git paths
This commit is contained in:
@@ -300,6 +300,12 @@ have exited, rather than only testing a directly built CLI or a warm cache.
|
|||||||
|
|
||||||
## R08: Reuse the existing repository-path semantics for record storage — P2
|
## R08: Reuse the existing repository-path semantics for record storage — P2
|
||||||
|
|
||||||
|
**Completed:** R04's shared resolver reuses the established Git root and
|
||||||
|
metadata-path normalization. Added regressions passed for repository roots and
|
||||||
|
separate metadata directories ending in whitespace, default/relative read-write
|
||||||
|
agreement, and rejection of absolute unignored worktree stores. Existing ordinary
|
||||||
|
and linked-worktree recording tests also passed.
|
||||||
|
|
||||||
**Relevant code:** `internal/publish/record.go:112`, especially line 117;
|
**Relevant code:** `internal/publish/record.go:112`, especially line 117;
|
||||||
`internal/publish/attempts.go:74`, especially line 82; the existing
|
`internal/publish/attempts.go:74`, especially line 82; the existing
|
||||||
`internal/git/source.go:39` and `source.go:50` repository-root helpers.
|
`internal/git/source.go:39` and `source.go:50` repository-root helpers.
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -172,6 +173,47 @@ func TestSaveEvidenceAllowsExplicitGitMetadataStores(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRecordStoragePreservesWhitespaceInRepositoryAndMetadataPaths(t *testing.T) {
|
||||||
|
for _, separate := range []bool{false, true} {
|
||||||
|
t.Run(fmt.Sprintf("separate=%t", separate), func(t *testing.T) {
|
||||||
|
original := recordRepo(t)
|
||||||
|
repo := original + " "
|
||||||
|
if err := os.Rename(original, repo); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
// recordRepo's temporary-directory cleanup owns the old spelling.
|
||||||
|
t.Cleanup(func() { _ = os.RemoveAll(repo) })
|
||||||
|
if separate {
|
||||||
|
recordGit(t, repo, "init", "--separate-git-dir", filepath.Join(t.TempDir(), "metadata "))
|
||||||
|
}
|
||||||
|
if err := os.WriteFile(filepath.Join(repo, ".gitignore"), []byte("saved/\n"), 0600); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
recordGit(t, repo, "add", ".gitignore")
|
||||||
|
recordGit(t, repo, "commit", "-qm", "Ignore saved records")
|
||||||
|
for _, override := range []string{"", "saved"} {
|
||||||
|
path, err := SaveEvidence(t.Context(), repo, override, Evidence{RepositoryDir: repo, Tag: "v1.2.3"})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
listed, err := ListAttempts(t.Context(), repo, override)
|
||||||
|
if err != nil || len(listed.Attempts) != 1 || listed.Attempts[0].RecordPath != path || listed.Attempts[0].Evidence.RepositoryDir != repo {
|
||||||
|
t.Fatalf("read/write disagreement for %q: %#v, %v", override, listed, err)
|
||||||
|
}
|
||||||
|
if override != "" && filepath.Dir(path) != filepath.Join(repo, override) {
|
||||||
|
t.Fatalf("changed repository path: %q", path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if _, err := SaveEvidence(t.Context(), repo, filepath.Join(repo, "unignored"), Evidence{}); err == nil {
|
||||||
|
t.Fatal("absolute unignored store was misclassified as external")
|
||||||
|
}
|
||||||
|
if status := recordGit(t, repo, "status", "--porcelain"); status != "" {
|
||||||
|
t.Fatalf("recording changed candidate: %s", status)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestSaveEvidenceRejectsUnignoredOverrideInsideWorktree(t *testing.T) {
|
func TestSaveEvidenceRejectsUnignoredOverrideInsideWorktree(t *testing.T) {
|
||||||
repo := recordRepo(t)
|
repo := recordRepo(t)
|
||||||
_, err := SaveEvidence(t.Context(), repo, "records", Evidence{Tag: "v1.2.3"})
|
_, err := SaveEvidence(t.Context(), repo, "records", Evidence{Tag: "v1.2.3"})
|
||||||
|
|||||||
Reference in New Issue
Block a user