79 lines
925 B
Go
79 lines
925 B
Go
package actionsglob
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
func Match(pat string, s string) bool {
|
|
if len(pat) == 0 {
|
|
panic(fmt.Sprintf("unexpected length of pattern: %d", len(pat)))
|
|
}
|
|
|
|
var inverse bool
|
|
|
|
if pat[0] == '!' {
|
|
pat = pat[1:]
|
|
inverse = true
|
|
}
|
|
|
|
tokens := strings.SplitAfter(pat, "*")
|
|
|
|
var wildcardInHead bool
|
|
|
|
for i := 0; i < len(tokens); i++ {
|
|
p := tokens[i]
|
|
|
|
if p == "" {
|
|
s = ""
|
|
break
|
|
}
|
|
|
|
if p == "*" {
|
|
if i == len(tokens)-1 {
|
|
s = ""
|
|
break
|
|
}
|
|
|
|
wildcardInHead = true
|
|
|
|
continue
|
|
}
|
|
|
|
wildcardInTail := p[len(p)-1] == '*'
|
|
if wildcardInTail {
|
|
p = p[:len(p)-1]
|
|
}
|
|
|
|
subs := strings.SplitN(s, p, 2)
|
|
|
|
if len(subs) == 0 {
|
|
break
|
|
}
|
|
|
|
if subs[0] != "" {
|
|
if !wildcardInHead {
|
|
break
|
|
}
|
|
}
|
|
|
|
if subs[1] != "" {
|
|
if !wildcardInTail {
|
|
break
|
|
}
|
|
}
|
|
|
|
s = subs[1]
|
|
|
|
wildcardInHead = wildcardInTail
|
|
}
|
|
|
|
r := s == ""
|
|
|
|
if inverse {
|
|
r = !r
|
|
}
|
|
|
|
return r
|
|
}
|