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/": {"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 (/, /cmd//)", h.Path, h.Pattern) } }