diff options
author | Kevin Ballard <kevin@sb.org> | 2010-02-25 09:15:52 -0800 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-02-25 09:15:52 -0800 |
commit | 20834d644f72a327b440cb76120f020c98297024 (patch) | |
tree | b8182b80a6aafbedcc873bb2a247dfa5628eafe0 | |
parent | 24ee7f799c734cf07b98bab672f5feb4ad0c6862 (diff) | |
download | go-20834d644f72a327b440cb76120f020c98297024.tar.gz go-20834d644f72a327b440cb76120f020c98297024.zip |
path: Fix bug in Match with non-greedy stars
path.Match() errors out when testing "*x" against "xxx"
because it matches the star non-greedily. Ensure that
the last chunk consumes the rest of the name.
R=r, rsc
CC=golang-dev
https://golang.org/cl/223050
-rw-r--r-- | src/pkg/path/match.go | 9 | ||||
-rw-r--r-- | src/pkg/path/match_test.go | 1 |
2 files changed, 9 insertions, 1 deletions
diff --git a/src/pkg/path/match.go b/src/pkg/path/match.go index 4e42b6a10d..e3cf08cae2 100644 --- a/src/pkg/path/match.go +++ b/src/pkg/path/match.go @@ -41,7 +41,10 @@ Pattern: } // Look for match at current position. t, ok, err := matchChunk(chunk, name) - if ok { + // if we're the last chunk, make sure we've exhausted the name + // otherwise we'll give a false result even if we could still match + // using the star + if ok && (len(t) == 0 || len(pattern) > 0) { name = t continue } @@ -54,6 +57,10 @@ Pattern: for i := 0; i < len(name) && name[i] != '/'; i++ { t, ok, err := matchChunk(chunk, name[i+1:]) if ok { + // if we're the last chunk, make sure we exhausted the name + if len(pattern) == 0 && len(t) > 0 { + continue + } name = t continue Pattern } diff --git a/src/pkg/path/match_test.go b/src/pkg/path/match_test.go index d3cd088f19..c02384f927 100644 --- a/src/pkg/path/match_test.go +++ b/src/pkg/path/match_test.go @@ -64,6 +64,7 @@ var matchTests = []MatchTest{ MatchTest{"[-x]", "a", false, ErrBadPattern}, MatchTest{"\\", "a", false, ErrBadPattern}, MatchTest{"[a-b-c]", "a", false, ErrBadPattern}, + MatchTest{"*x", "xxx", true, nil}, } func TestMatch(t *testing.T) { |