You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.0 KiB
Go
50 lines
1.0 KiB
Go
5 years ago
|
package main
|
||
|
|
||
|
import (
|
||
|
"path"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// All source code in this file is copied from the main Go repository, licensed
|
||
|
// under the same license as this project, BSD-3-Clause.
|
||
|
|
||
|
func GlobsMatchPath(globs, target string) bool {
|
||
|
for globs != "" {
|
||
|
// Extract next non-empty glob in comma-separated list.
|
||
|
var glob string
|
||
|
if i := strings.Index(globs, ","); i >= 0 {
|
||
|
glob, globs = globs[:i], globs[i+1:]
|
||
|
} else {
|
||
|
glob, globs = globs, ""
|
||
|
}
|
||
|
if glob == "" {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
// A glob with N+1 path elements (N slashes) needs to be matched
|
||
|
// against the first N+1 path elements of target,
|
||
|
// which end just before the N+1'th slash.
|
||
|
n := strings.Count(glob, "/")
|
||
|
prefix := target
|
||
|
// Walk target, counting slashes, truncating at the N+1'th slash.
|
||
|
for i := 0; i < len(target); i++ {
|
||
|
if target[i] == '/' {
|
||
|
if n == 0 {
|
||
|
prefix = target[:i]
|
||
|
break
|
||
|
}
|
||
|
n--
|
||
|
}
|
||
|
}
|
||
|
if n > 0 {
|
||
|
// Not enough prefix elements.
|
||
|
continue
|
||
|
}
|
||
|
matched, _ := path.Match(glob, prefix)
|
||
|
if matched {
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
return false
|
||
|
}
|