aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--hugofs/glob.go7
-rw-r--r--hugofs/glob/filename_filter.go8
-rw-r--r--hugofs/glob/filename_filter_test.go5
-rw-r--r--hugofs/glob/glob.go42
-rw-r--r--hugofs/glob/glob_test.go6
-rw-r--r--hugofs/glob_test.go6
-rw-r--r--resources/resource_factories/create/create.go2
7 files changed, 25 insertions, 51 deletions
diff --git a/hugofs/glob.go b/hugofs/glob.go
index e691cdc10..1b649a283 100644
--- a/hugofs/glob.go
+++ b/hugofs/glob.go
@@ -26,19 +26,20 @@ import (
// Glob walks the fs and passes all matches to the handle func.
// The handle func can return true to signal a stop.
func Glob(fs afero.Fs, pattern string, handle func(fi FileMetaInfo) (bool, error)) error {
- pattern = glob.NormalizePathCaseSensitive(pattern)
+ pattern = glob.NormalizePathNoLower(pattern)
if pattern == "" {
return nil
}
+ root := glob.ResolveRootDir(pattern)
+ pattern = strings.ToLower(pattern)
- g, err := glob.GetFilenamesGlob(pattern)
+ g, err := glob.GetGlob(pattern)
if err != nil {
return err
}
hasSuperAsterisk := strings.Contains(pattern, "**")
levels := strings.Count(pattern, "/")
- root := glob.ResolveRootDir(pattern)
// Signals that we're done.
done := errors.New("done")
diff --git a/hugofs/glob/filename_filter.go b/hugofs/glob/filename_filter.go
index c4b582bd5..8e8af554b 100644
--- a/hugofs/glob/filename_filter.go
+++ b/hugofs/glob/filename_filter.go
@@ -49,7 +49,7 @@ func NewFilenameFilter(inclusions, exclusions []string) (*FilenameFilter, error)
for _, include := range inclusions {
include = normalizeFilenameGlobPattern(include)
- g, err := filenamesGlobCache.GetGlob(include)
+ g, err := GetGlob(include)
if err != nil {
return nil, err
}
@@ -60,9 +60,9 @@ func NewFilenameFilter(inclusions, exclusions []string) (*FilenameFilter, error)
// gets included.
dir := path.Dir(include)
parts := strings.Split(dir, "/")
- for i, _ := range parts {
+ for i := range parts {
pattern := "/" + filepath.Join(parts[:i+1]...)
- g, err := filenamesGlobCache.GetGlob(pattern)
+ g, err := GetGlob(pattern)
if err != nil {
return nil, err
}
@@ -72,7 +72,7 @@ func NewFilenameFilter(inclusions, exclusions []string) (*FilenameFilter, error)
for _, exclude := range exclusions {
exclude = normalizeFilenameGlobPattern(exclude)
- g, err := filenamesGlobCache.GetGlob(exclude)
+ g, err := GetGlob(exclude)
if err != nil {
return nil, err
}
diff --git a/hugofs/glob/filename_filter_test.go b/hugofs/glob/filename_filter_test.go
index 1fce5b135..b74982ef3 100644
--- a/hugofs/glob/filename_filter_test.go
+++ b/hugofs/glob/filename_filter_test.go
@@ -42,6 +42,11 @@ func TestFilenameFilter(t *testing.T) {
c.Assert(excludeAllButFooJSON.Match(filepath.FromSlash("/a/b/"), true), qt.Equals, true)
c.Assert(excludeAllButFooJSON.Match(filepath.FromSlash("/"), true), qt.Equals, true)
c.Assert(excludeAllButFooJSON.Match(filepath.FromSlash("/b"), true), qt.Equals, false)
+
+ excludeAllButFooJSONMixedCasePattern, err := NewFilenameFilter([]string{"/**/Foo.json"}, nil)
+ c.Assert(excludeAllButFooJSONMixedCasePattern.Match(filepath.FromSlash("/a/b/c/d/e/foo.json"), false), qt.Equals, true)
+ c.Assert(excludeAllButFooJSONMixedCasePattern.Match(filepath.FromSlash("/a/b/c/d/e/FOO.json"), false), qt.Equals, true)
+
c.Assert(err, qt.IsNil)
nopFilter, err := NewFilenameFilter(nil, nil)
diff --git a/hugofs/glob/glob.go b/hugofs/glob/glob.go
index 87619802e..841824bcc 100644
--- a/hugofs/glob/glob.go
+++ b/hugofs/glob/glob.go
@@ -33,11 +33,6 @@ var (
isWindows: isWindows,
cache: make(map[string]globErr),
}
-
- filenamesGlobCache = &globCache{
- isWindows: isWindows,
- cache: make(map[string]globErr),
- }
)
type globErr struct {
@@ -86,10 +81,6 @@ func (gc *globCache) GetGlob(pattern string) (glob.Glob, error) {
}
type globDecorator struct {
- // Whether both pattern and the strings to match will be matched
- // by their original case.
- isCaseSensitive bool
-
// On Windows we may get filenames with Windows slashes to match,
// which wee need to normalize.
isWindows bool
@@ -101,14 +92,12 @@ func (g globDecorator) Match(s string) bool {
if g.isWindows {
s = filepath.ToSlash(s)
}
- if !g.isCaseSensitive {
- s = strings.ToLower(s)
- }
+ s = strings.ToLower(s)
return g.g.Match(s)
}
type globDecoratorDouble struct {
- lowerCase glob.Glob
+ lowerCase glob.Glob
originalCase glob.Glob
}
@@ -120,34 +109,11 @@ func GetGlob(pattern string) (glob.Glob, error) {
return defaultGlobCache.GetGlob(pattern)
}
-func GetFilenamesGlob(pattern string) (glob.Glob, error) {
- lowered := strings.ToLower(pattern)
- hasUpperCase := pattern != lowered
- gLowered, err := filenamesGlobCache.GetGlob(lowered)
- if err != nil {
- return nil, err
- }
-
- if !hasUpperCase {
- return gLowered, nil
- }
-
- gSensitive, err := filenamesGlobCache.GetGlob(pattern)
- if err != nil {
- return nil, err
- }
- return globDecoratorDouble{
- lowerCase: gLowered,
- originalCase: gSensitive,
- }, nil
-
-}
-
func NormalizePath(p string) string {
- return strings.Trim(path.Clean(filepath.ToSlash(strings.ToLower(p))), "/.")
+ return strings.ToLower(NormalizePathNoLower(p))
}
-func NormalizePathCaseSensitive(p string) string {
+func NormalizePathNoLower(p string) string {
return strings.Trim(path.Clean(filepath.ToSlash(p)), "/.")
}
diff --git a/hugofs/glob/glob_test.go b/hugofs/glob/glob_test.go
index 66efe9e53..d40e16edc 100644
--- a/hugofs/glob/glob_test.go
+++ b/hugofs/glob/glob_test.go
@@ -66,7 +66,7 @@ func TestNormalizePath(t *testing.T) {
}
func TestGetGlob(t *testing.T) {
- for _, cache := range []*globCache{defaultGlobCache, filenamesGlobCache} {
+ for _, cache := range []*globCache{defaultGlobCache} {
c := qt.New(t)
g, err := cache.GetGlob("**.JSON")
c.Assert(err, qt.IsNil)
@@ -89,8 +89,8 @@ func BenchmarkGetGlob(b *testing.B) {
}
runBench("Default cache", defaultGlobCache, "abcde")
- runBench("Filenames cache, lowercase searchs", filenamesGlobCache, "abcde")
- runBench("Filenames cache, mixed case searchs", filenamesGlobCache, "abCDe")
+ runBench("Filenames cache, lowercase searchs", defaultGlobCache, "abcde")
+ runBench("Filenames cache, mixed case searchs", defaultGlobCache, "abCDe")
b.Run("GetGlob", func(b *testing.B) {
for i := 0; i < b.N; i++ {
diff --git a/hugofs/glob_test.go b/hugofs/glob_test.go
index fbb276445..a6ae85fc8 100644
--- a/hugofs/glob_test.go
+++ b/hugofs/glob_test.go
@@ -52,14 +52,16 @@ func TestGlob(t *testing.T) {
create("UPPER/sub/style.css")
create("root/UPPER/sub/style.css")
+ c.Assert(collect(filepath.FromSlash("/jsonfiles/*.json")), qt.HasLen, 2)
+
c.Assert(collect("**.json"), qt.HasLen, 5)
c.Assert(collect("**"), qt.HasLen, 8)
c.Assert(collect(""), qt.HasLen, 0)
c.Assert(collect("jsonfiles/*.json"), qt.HasLen, 2)
c.Assert(collect("*.json"), qt.HasLen, 1)
c.Assert(collect("**.xml"), qt.HasLen, 1)
- c.Assert(collect(filepath.FromSlash("/jsonfiles/*.json")), qt.HasLen, 2)
- c.Assert(collect("UPPER/sub/style.css"), qt.HasLen, 1)
+
c.Assert(collect("root/UPPER/sub/style.css"), qt.HasLen, 1)
+ c.Assert(collect("UPPER/sub/style.css"), qt.HasLen, 1)
}
diff --git a/resources/resource_factories/create/create.go b/resources/resource_factories/create/create.go
index 508c141f6..075d25736 100644
--- a/resources/resource_factories/create/create.go
+++ b/resources/resource_factories/create/create.go
@@ -93,7 +93,7 @@ func (c *Client) GetMatch(pattern string) (resource.Resource, error) {
}
func (c *Client) match(name, pattern string, matchFunc func(r resource.Resource) bool, firstOnly bool) (resource.Resources, error) {
- pattern = glob.NormalizePathCaseSensitive(pattern)
+ pattern = glob.NormalizePath(pattern)
partitions := glob.FilterGlobParts(strings.Split(pattern, "/"))
if len(partitions) == 0 {
partitions = []string{resources.CACHE_OTHER}