A bare pattern meant for a binary (mesh-build-node) matched the command directory of the same name, so git ignored every new file there and publish.go was never committed (catalogue review F1). The kind: every bare pattern of a module's .gitignore is anchored to the binary (nfs-server's hid all of cmd/nfs-server), and checks/gitignored refuses an ignore pattern, the module's or the catalogue's, that hides a directory under a module's cmd/ or internal/, a Go file added there, or a source file there, in a git checkout and a plain folder alike. Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
81 lines
2.8 KiB
Go
81 lines
2.8 KiB
Go
package gitignored
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// The kind of catalogue review F1: a bare pattern hides the command directory it shares a name with; an anchored one
|
|
// hides the binary alone; a glob that ignores source is refused too; a negation keeps a path.
|
|
func TestFindNamesEachPatternThatHidesSource(t *testing.T) {
|
|
for name, c := range map[string]struct {
|
|
ignore string
|
|
hidden []string
|
|
}{
|
|
"a bare name hides cmd/<name>": {"nfs-server\n", []string{"modules/m/cmd/nfs-server/", "modules/m/cmd/nfs-server/" + Probe, "modules/m/cmd/nfs-server/main.go"}},
|
|
"anchored to the binary": {"/nfs-server\n/cmd/nfs-server/nfs-server\n", nil},
|
|
"a glob ignoring Go source": {"*.go\n!main.go\n", []string{"modules/m/cmd/" + Probe, "modules/m/cmd/nfs-server/" + Probe,
|
|
"modules/m/internal/" + Probe, "modules/m/internal/x/" + Probe, "modules/m/internal/x/x.go"}},
|
|
"a pattern over internal/": {"internal/\n", []string{"modules/m/internal/", "modules/m/internal/" + Probe, "modules/m/internal/x/",
|
|
"modules/m/internal/x/" + Probe, "modules/m/internal/x/x.go"}},
|
|
"nothing but generated JavaScript": {"*.js\n", nil},
|
|
} {
|
|
root := t.TempDir()
|
|
for f, b := range map[string]string{
|
|
"modules/m/.gitignore": c.ignore,
|
|
"modules/m/cmd/nfs-server/main.go": "package main\n",
|
|
"modules/m/cmd/nfs-server/run.js": "",
|
|
"modules/m/internal/x/x.go": "package x\n",
|
|
"modules/m/node_modules/y/index.go": "",
|
|
"modules/other/cmd/other/other.go": "package main\n",
|
|
} {
|
|
p := filepath.Join(root, f)
|
|
if err := os.MkdirAll(filepath.Dir(p), 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := os.WriteFile(p, []byte(b), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
dirs, err := Sources(root)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
got, err := Find(root, dirs)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var paths []string
|
|
for _, h := range got {
|
|
paths = append(paths, h.Path)
|
|
if !strings.HasPrefix(h.Pattern, "modules/m/.gitignore:") {
|
|
t.Errorf("%s: %s is named hidden by %q, want the module's .gitignore", name, h.Path, h.Pattern)
|
|
}
|
|
}
|
|
if strings.Join(paths, ",") != strings.Join(c.hidden, ",") {
|
|
t.Errorf("%s: hidden %v, want %v", name, paths, c.hidden)
|
|
}
|
|
}
|
|
}
|
|
|
|
// The catalogue's own tree: no ignore pattern hides a path under a module's cmd/ or internal/.
|
|
func TestNoIgnorePatternHidesAModulesSource(t *testing.T) {
|
|
root := filepath.Join("..", "..")
|
|
dirs, err := Sources(root)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(dirs) == 0 {
|
|
t.Fatal("no module source directory found: the check reads nothing")
|
|
}
|
|
hidden, err := Find(root, dirs)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, h := range hidden {
|
|
t.Errorf("%s is hidden by %s: a module's source is never ignored; anchor the pattern to the binary (/<name>, /cmd/<name>/<name>)", h.Path, h.Pattern)
|
|
}
|
|
}
|