Skip to content

Commit 4e3ab7c

Browse files
authored
Fix .vercelignore negation patterns (#574)
1 parent 5fb44e8 commit 4e3ab7c

2 files changed

Lines changed: 96 additions & 1 deletion

File tree

file/glob.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,16 @@ func GetPaths(basePath string, ignorePatterns []string) ([]string, error) {
2020
if err != nil {
2121
return err
2222
}
23-
ignored := ignore.MatchesPath(path)
23+
24+
relativePath, err := filepath.Rel(basePath, path)
25+
if err != nil {
26+
return fmt.Errorf("error finding path relative to base: %w", err)
27+
}
28+
if relativePath == "." {
29+
return nil
30+
}
31+
32+
ignored := ignore.MatchesPath(filepath.ToSlash(relativePath))
2433

2534
if d.IsDir() && ignored {
2635
return filepath.SkipDir

file/glob_test.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package file
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
"slices"
7+
"testing"
8+
)
9+
10+
func TestGetPaths(t *testing.T) {
11+
t.Parallel()
12+
13+
tests := map[string]struct {
14+
files []string
15+
ignorePatterns []string
16+
expected []string
17+
}{
18+
"allowlist patterns": {
19+
files: []string{
20+
".vercelignore",
21+
"api/example.js",
22+
"example",
23+
"index.html",
24+
"main.tf",
25+
"providers.tf",
26+
"vercel.json",
27+
"versions.tf",
28+
},
29+
ignorePatterns: []string{"/*", "!api", "!vercel.json", "!*.html"},
30+
expected: []string{"api/example.js", "index.html", "vercel.json"},
31+
},
32+
"root anchored pattern": {
33+
files: []string{"root.txt", "nested/root.txt", "nested/other.txt"},
34+
ignorePatterns: []string{"/root.txt"},
35+
expected: []string{"nested/other.txt", "nested/root.txt"},
36+
},
37+
}
38+
39+
for name, test := range tests {
40+
t.Run(name, func(t *testing.T) {
41+
t.Parallel()
42+
43+
root := t.TempDir()
44+
workingDirectory, err := filepath.Abs(".")
45+
if err != nil {
46+
t.Fatal(err)
47+
}
48+
49+
for _, name := range test.files {
50+
path := filepath.Join(root, name)
51+
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
52+
t.Fatal(err)
53+
}
54+
if err := os.WriteFile(path, nil, 0o644); err != nil {
55+
t.Fatal(err)
56+
}
57+
}
58+
59+
relativeRoot, err := filepath.Rel(workingDirectory, root)
60+
if err != nil {
61+
t.Fatal(err)
62+
}
63+
64+
for _, basePath := range []string{root, relativeRoot} {
65+
paths, err := GetPaths(basePath, test.ignorePatterns)
66+
if err != nil {
67+
t.Fatal(err)
68+
}
69+
70+
actual := make([]string, 0, len(paths))
71+
for _, path := range paths {
72+
relativePath, err := filepath.Rel(basePath, path)
73+
if err != nil {
74+
t.Fatal(err)
75+
}
76+
actual = append(actual, filepath.ToSlash(relativePath))
77+
}
78+
slices.Sort(actual)
79+
80+
if !slices.Equal(actual, test.expected) {
81+
t.Fatalf("GetPaths(%q) = %q, want %q", basePath, actual, test.expected)
82+
}
83+
}
84+
})
85+
}
86+
}

0 commit comments

Comments
 (0)