Skip to content

Commit 2ac081b

Browse files
idsulikglours
authored andcommitted
fix(dockerignore): Add wildcard support to dockerignore.go
Signed-off-by: Suleiman Dibirov <[email protected]>
1 parent eeea049 commit 2ac081b

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-0
lines changed

pkg/watch/dockerignore.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"io"
2222
"os"
2323
"path/filepath"
24+
"slices"
2425
"strings"
2526

2627
"github.com/compose-spec/compose-go/v2/types"
@@ -128,6 +129,15 @@ func NewDockerPatternMatcher(repoRoot string, patterns []string) (*dockerPathMat
128129
return nil, err
129130
}
130131

132+
// Check if "*" is present in patterns
133+
hasAllPattern := slices.Contains(patterns, "*")
134+
if hasAllPattern {
135+
// Remove all non-exclusion patterns (those that don't start with '!')
136+
patterns = slices.DeleteFunc(patterns, func(p string) bool {
137+
return len(p) > 0 && p[0] != '!' // Only keep exclusion patterns
138+
})
139+
}
140+
131141
pm, err := patternmatcher.New(absPatterns(absRoot, patterns))
132142
if err != nil {
133143
return nil, err

pkg/watch/dockerignore_test.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package watch
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestNewDockerPatternMatcher(t *testing.T) {
8+
tests := []struct {
9+
name string
10+
repoRoot string
11+
patterns []string
12+
expectedErr bool
13+
expectedRoot string
14+
expectedPat []string
15+
}{
16+
{
17+
name: "Basic patterns without wildcard",
18+
repoRoot: "/repo",
19+
patterns: []string{"dir1/", "file.txt"},
20+
expectedErr: false,
21+
expectedRoot: "/repo",
22+
expectedPat: []string{"/repo/dir1", "/repo/file.txt"},
23+
},
24+
{
25+
name: "Patterns with exclusion",
26+
repoRoot: "/repo",
27+
patterns: []string{"dir1/", "!file.txt"},
28+
expectedErr: false,
29+
expectedRoot: "/repo",
30+
expectedPat: []string{"/repo/dir1", "!/repo/file.txt"},
31+
},
32+
{
33+
name: "Wildcard with exclusion",
34+
repoRoot: "/repo",
35+
patterns: []string{"*", "!file.txt"},
36+
expectedErr: false,
37+
expectedRoot: "/repo",
38+
expectedPat: []string{"!/repo/file.txt"},
39+
},
40+
{
41+
name: "No patterns",
42+
repoRoot: "/repo",
43+
patterns: []string{},
44+
expectedErr: false,
45+
expectedRoot: "/repo",
46+
expectedPat: nil,
47+
},
48+
{
49+
name: "Only exclusion pattern",
50+
repoRoot: "/repo",
51+
patterns: []string{"!file.txt"},
52+
expectedErr: false,
53+
expectedRoot: "/repo",
54+
expectedPat: []string{"!/repo/file.txt"},
55+
},
56+
}
57+
58+
for _, tt := range tests {
59+
t.Run(tt.name, func(t *testing.T) {
60+
// Call the function with the test data
61+
matcher, err := NewDockerPatternMatcher(tt.repoRoot, tt.patterns)
62+
63+
// Check if we expect an error
64+
if (err != nil) != tt.expectedErr {
65+
t.Fatalf("expected error: %v, got: %v", tt.expectedErr, err)
66+
}
67+
68+
// If no error is expected, check the output
69+
if !tt.expectedErr {
70+
if matcher.repoRoot != tt.expectedRoot {
71+
t.Errorf("expected root: %v, got: %v", tt.expectedRoot, matcher.repoRoot)
72+
}
73+
74+
// Compare patterns
75+
actualPatterns := matcher.matcher.Patterns()
76+
if len(actualPatterns) != len(tt.expectedPat) {
77+
t.Errorf("expected patterns length: %v, got: %v", len(tt.expectedPat), len(actualPatterns))
78+
}
79+
80+
for i, expectedPat := range tt.expectedPat {
81+
actualPatternStr := actualPatterns[i].String()
82+
if actualPatterns[i].Exclusion() {
83+
actualPatternStr = "!" + actualPatternStr
84+
}
85+
if actualPatternStr != expectedPat {
86+
t.Errorf("expected pattern: %v, got: %v", expectedPat, actualPatterns[i])
87+
}
88+
}
89+
}
90+
})
91+
}
92+
}

0 commit comments

Comments
 (0)