80 lines
2.4 KiB
Go
80 lines
2.4 KiB
Go
|
|
package main
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"context"
|
|||
|
|
"os"
|
|||
|
|
"path/filepath"
|
|||
|
|
"testing"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
func TestScannerCountsAndExcludes(t *testing.T) {
|
|||
|
|
root := t.TempDir()
|
|||
|
|
if err := os.WriteFile(filepath.Join(root, "main.go"), []byte("package main\n\n// note\nfunc main() {}\n"), 0644); err != nil {
|
|||
|
|
t.Fatal(err)
|
|||
|
|
}
|
|||
|
|
if err := os.Mkdir(filepath.Join(root, "node_modules"), 0755); err != nil {
|
|||
|
|
t.Fatal(err)
|
|||
|
|
}
|
|||
|
|
if err := os.WriteFile(filepath.Join(root, "node_modules", "bad.js"), []byte("alert(1)\n"), 0644); err != nil {
|
|||
|
|
t.Fatal(err)
|
|||
|
|
}
|
|||
|
|
langs, files, err := (Scanner{}).Analyze(context.Background(), root, []ExclusionRule{{Pattern: "node_modules"}}, func(int, string) {})
|
|||
|
|
if err != nil {
|
|||
|
|
t.Fatal(err)
|
|||
|
|
}
|
|||
|
|
if len(langs) != 1 || langs[0].Name != "Go" {
|
|||
|
|
t.Fatalf("unexpected languages: %#v", langs)
|
|||
|
|
}
|
|||
|
|
if langs[0].Code != 2 || langs[0].Comments != 1 || langs[0].Blanks != 1 {
|
|||
|
|
t.Fatalf("unexpected count: %#v", langs[0])
|
|||
|
|
}
|
|||
|
|
for _, f := range files {
|
|||
|
|
if f.Name == "bad.js" {
|
|||
|
|
t.Fatal("excluded file was scanned")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func TestWildcardMatch(t *testing.T) {
|
|||
|
|
cases := []struct {
|
|||
|
|
p, s string
|
|||
|
|
want bool
|
|||
|
|
}{{"*.log", "storage/app.log", true}, {"vendor", "vendor/a.php", true}, {"dist", "src/main.js", false}}
|
|||
|
|
for _, c := range cases {
|
|||
|
|
if got := wildcardMatch(c.p, c.s); got != c.want {
|
|||
|
|
t.Errorf("%s %s = %v", c.p, c.s, got)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func TestNestedGitignoreDoesNotExcludeSiblingSource(t *testing.T) {
|
|||
|
|
root := t.TempDir()
|
|||
|
|
dependency := filepath.Join(root, "vendor", "package")
|
|||
|
|
if err := os.MkdirAll(dependency, 0755); err != nil {
|
|||
|
|
t.Fatal(err)
|
|||
|
|
}
|
|||
|
|
// 依赖包中的局部规则只应作用于 vendor/package,不能过滤项目根目录。
|
|||
|
|
if err := os.WriteFile(filepath.Join(dependency, ".gitignore"), []byte("*\n"), 0644); err != nil {
|
|||
|
|
t.Fatal(err)
|
|||
|
|
}
|
|||
|
|
if err := os.WriteFile(filepath.Join(dependency, "ignored.go"), []byte("package ignored\n"), 0644); err != nil {
|
|||
|
|
t.Fatal(err)
|
|||
|
|
}
|
|||
|
|
if err := os.WriteFile(filepath.Join(root, "main.go"), []byte("package main\nfunc main() {}\n"), 0644); err != nil {
|
|||
|
|
t.Fatal(err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
langs, files, err := (Scanner{}).Analyze(context.Background(), root, nil, func(int, string) {})
|
|||
|
|
if err != nil {
|
|||
|
|
t.Fatal(err)
|
|||
|
|
}
|
|||
|
|
if len(langs) != 1 || langs[0].Name != "Go" || langs[0].Files != 1 {
|
|||
|
|
t.Fatalf("嵌套 .gitignore 错误影响了同级源码: %#v", langs)
|
|||
|
|
}
|
|||
|
|
for _, file := range files {
|
|||
|
|
if file.Name == "ignored.go" {
|
|||
|
|
t.Fatal("嵌套 .gitignore 未排除自身目录中的文件")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|