Fix IsVendor() regex generation

The regex generation introduced by
20726a1de3
had a subtle but important bug in it. In particular the ^ and ^|/
prefixes were only applied to the first regex in the OR'd groupings and
not every regex in the grouping.

We fix this by wrapping each of those OR'd groups in a new non capturing
group to ensure the prefix applies to every entry in the OR'd listing.

Additionally we add three new quick tests of IsVendor to guard against
this regression in the future.

This fixes https://github.com/go-enry/go-enry/issues/135
This commit is contained in:
Clark Boylan 2022-08-25 16:18:45 -07:00
parent ed2adad159
commit 16a5ff8e22
2 changed files with 7 additions and 4 deletions

View File

@ -213,23 +213,23 @@ func init() {
sb := &strings.Builder{} sb := &strings.Builder{}
// Start with group 1 - those that started with `^` // Start with group 1 - those that started with `^`
sb.WriteString("(?:^(?:") sb.WriteString("(?:^(?:(?:")
sb.WriteString(caretStrings[0]) sb.WriteString(caretStrings[0])
for _, matcher := range caretStrings[1:] { for _, matcher := range caretStrings[1:] {
sb.WriteString(")|(?:") sb.WriteString(")|(?:")
sb.WriteString(matcher) sb.WriteString(matcher)
} }
sb.WriteString("))") sb.WriteString(")))")
sb.WriteString("|") sb.WriteString("|")
// Now add group 2 - those that started with `(^|/)` // Now add group 2 - those that started with `(^|/)`
sb.WriteString("(?:(?:^|/)(?:") sb.WriteString("(?:(?:^|/)(?:(?:")
sb.WriteString(caretSegmentStrings[0]) sb.WriteString(caretSegmentStrings[0])
for _, matcher := range caretSegmentStrings[1:] { for _, matcher := range caretSegmentStrings[1:] {
sb.WriteString(")|(?:") sb.WriteString(")|(?:")
sb.WriteString(matcher) sb.WriteString(matcher)
} }
sb.WriteString("))") sb.WriteString(")))")
sb.WriteString("|") sb.WriteString("|")
// Finally add the rest // Finally add the rest

View File

@ -17,6 +17,7 @@ func TestIsVendor(t *testing.T) {
expected bool expected bool
}{ }{
{"cache/", true}, {"cache/", true},
{"something_cache/", false},
{"random/cache/", true}, {"random/cache/", true},
{"cache", false}, {"cache", false},
{"dependencies/", true}, {"dependencies/", true},
@ -27,6 +28,7 @@ func TestIsVendor(t *testing.T) {
{"random/dist/", true}, {"random/dist/", true},
{"random/dist", false}, {"random/dist", false},
{"deps/", true}, {"deps/", true},
{"foodeps/", false},
{"configure", true}, {"configure", true},
{"a/configure", true}, {"a/configure", true},
{"config.guess", true}, {"config.guess", true},
@ -43,6 +45,7 @@ func TestIsVendor(t *testing.T) {
{"foo/bar/MochiKit.js", true}, {"foo/bar/MochiKit.js", true},
{"foo/bar/dojo.js", true}, {"foo/bar/dojo.js", true},
{"foo/env/whatever", true}, {"foo/env/whatever", true},
{"some/python/venv/", false},
{"foo/.imageset/bar", true}, {"foo/.imageset/bar", true},
{"Vagrantfile", true}, {"Vagrantfile", true},
} }