-
Notifications
You must be signed in to change notification settings - Fork 16
/
initial_holder.go
62 lines (51 loc) · 1.41 KB
/
initial_holder.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package gitignore
import "strings"
const initials = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ."
type initialPatternHolder struct {
patterns initialPatterns
otherPatterns *patterns
}
func newInitialPatternHolder() initialPatternHolder {
return initialPatternHolder{
patterns: initialPatterns{m: map[byte]*patterns{}},
otherPatterns: &patterns{},
}
}
func (h *initialPatternHolder) add(pattern string) {
trimedPattern := strings.TrimPrefix(pattern, "/")
if strings.IndexAny(trimedPattern[0:1], initials) != -1 {
h.patterns.set(trimedPattern[0], newPatternForEqualizedPath(pattern))
} else {
h.otherPatterns.add(newPatternForEqualizedPath(pattern))
}
}
func (h initialPatternHolder) match(path string, isDir bool) bool {
if h.patterns.size() == 0 && h.otherPatterns.size() == 0 {
return false
}
if patterns, ok := h.patterns.get(path[0]); ok {
if patterns.match(path, isDir) {
return true
}
}
return h.otherPatterns.match(path, isDir)
}
type initialPatterns struct {
m map[byte]*patterns
}
func (p *initialPatterns) set(initial byte, pattern pattern) {
if ps, ok := p.m[initial]; ok {
ps.add(pattern)
} else {
patterns := &patterns{}
patterns.add(pattern)
p.m[initial] = patterns
}
}
func (p initialPatterns) get(initial byte) (*patterns, bool) {
patterns, ok := p.m[initial]
return patterns, ok
}
func (p initialPatterns) size() int {
return len(p.m)
}