Allow cascade to be a slice with a _target discriminator

Fixes #7782
This commit is contained in:
Bjørn Erik Pedersen
2020-10-05 20:01:52 +02:00
parent 5e2a547cb5
commit c63db7f1f6
11 changed files with 375 additions and 29 deletions

View File

@@ -23,30 +23,36 @@ import (
"github.com/gobwas/glob/syntax"
)
type globErr struct {
glob glob.Glob
err error
}
var (
globCache = make(map[string]glob.Glob)
globCache = make(map[string]globErr)
globMu sync.RWMutex
)
func GetGlob(pattern string) (glob.Glob, error) {
var g glob.Glob
var eg globErr
globMu.RLock()
g, found := globCache[pattern]
var found bool
eg, found = globCache[pattern]
globMu.RUnlock()
if !found {
var err error
g, err = glob.Compile(strings.ToLower(pattern), '/')
if err != nil {
return nil, err
}
globMu.Lock()
globCache[pattern] = g
globMu.Unlock()
if found {
return eg.glob, eg.err
}
return g, nil
var err error
g, err := glob.Compile(strings.ToLower(pattern), '/')
eg = globErr{g, err}
globMu.Lock()
globCache[pattern] = eg
globMu.Unlock()
return eg.glob, eg.err
}

View File

@@ -73,5 +73,14 @@ func TestGetGlob(t *testing.T) {
g, err := GetGlob("**.JSON")
c.Assert(err, qt.IsNil)
c.Assert(g.Match("data/my.json"), qt.Equals, true)
}
func BenchmarkGetGlob(b *testing.B) {
for i := 0; i < b.N; i++ {
_, err := GetGlob("**/foo")
if err != nil {
b.Fatal(err)
}
}
}