mirror of
https://github.com/LukeHagar/slinky.git
synced 2025-12-06 04:21:20 +00:00
Enhance URL ignoring logic in fsurls.go to support wildcard patterns and add tests for ignoring specific URLs. Introduce a new function to convert wildcard patterns to regex for improved matching accuracy.
This commit is contained in:
@@ -682,18 +682,34 @@ func isURLIgnored(u string, patterns []string) bool {
|
||||
if len(patterns) == 0 {
|
||||
return false
|
||||
}
|
||||
for _, p := range patterns {
|
||||
for _, raw := range patterns {
|
||||
p := strings.TrimSpace(raw)
|
||||
if p == "" {
|
||||
continue
|
||||
}
|
||||
// simple contains or wildcard suffix/prefix match
|
||||
if p == u || strings.Contains(u, p) {
|
||||
// No wildcards: exact or substring match
|
||||
if !strings.ContainsAny(p, "*?") {
|
||||
if u == p || strings.Contains(u, p) {
|
||||
return true
|
||||
}
|
||||
continue
|
||||
}
|
||||
// Glob-style: allow '*' to span slashes by converting '*' -> '**'
|
||||
dsPat := strings.ReplaceAll(p, "*", "**")
|
||||
if ok, _ := doublestar.PathMatch(dsPat, u); ok {
|
||||
return true
|
||||
}
|
||||
// doublestar path-like match for full URL string
|
||||
if ok, _ := doublestar.PathMatch(p, u); ok {
|
||||
// Regex fallback: '*' -> '.*', '?' -> '.'
|
||||
if re, err := wildcardToRegex(p); err == nil && re.MatchString(u) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func wildcardToRegex(pattern string) (*regexp.Regexp, error) {
|
||||
escaped := regexp.QuoteMeta(pattern)
|
||||
escaped = strings.ReplaceAll(escaped, "\\*", ".*")
|
||||
escaped = strings.ReplaceAll(escaped, "\\?", ".")
|
||||
return regexp.Compile("^" + escaped + "$")
|
||||
}
|
||||
|
||||
@@ -57,6 +57,17 @@ func TestCollectURLs_FromTestFiles(t *testing.T) {
|
||||
t.Fatalf("expected API URL %s to be ignored via .slinkignore", u)
|
||||
}
|
||||
}
|
||||
// URLs matching *acme* should be ignored
|
||||
acmeSamples := []string{
|
||||
"https://acme.com/logout",
|
||||
"http://sub.acme.example/logout",
|
||||
"https://docs.acme.dev",
|
||||
}
|
||||
for _, u := range acmeSamples {
|
||||
if _, ok := urls[u]; ok {
|
||||
t.Fatalf("expected %s to be ignored via *acme* pattern", u)
|
||||
}
|
||||
}
|
||||
|
||||
// Verify .slinkignore path ignores: file under ignore-me should not contribute
|
||||
for u, files := range urls {
|
||||
|
||||
5
testdata/test2_acme.md
vendored
Normal file
5
testdata/test2_acme.md
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
Here are some example URLs that should be ignored by pattern *acme*:
|
||||
|
||||
- https://acme.com/logout
|
||||
- http://sub.acme.example/logout
|
||||
- https://docs.acme.dev
|
||||
Reference in New Issue
Block a user