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