]> Cypherpunks repositories - gostls13.git/commitdiff
filepath: fix Glob to return no error on nonmatching patterns
authorMichael Shields <mshields@google.com>
Sat, 17 Sep 2011 03:30:54 +0000 (20:30 -0700)
committerRob Pike <r@golang.org>
Sat, 17 Sep 2011 03:30:54 +0000 (20:30 -0700)
filepath.Glob is documented to return nil if no files match
and an error only if the pattern is invalid.  This change
fixes it to work as documented and adds a regression test.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5040045

src/pkg/path/filepath/match.go
src/pkg/path/filepath/match_test.go
src/pkg/template/helper.go

index 7fcc214c05839c6836f186271d8b53babc0c59fa..0ccc87e65607393b821d956c5143e20940003260 100644 (file)
@@ -215,7 +215,7 @@ func getEsc(chunk string) (r int, nchunk string, err os.Error) {
 func Glob(pattern string) (matches []string, err os.Error) {
        if !hasMeta(pattern) {
                if _, err = os.Stat(pattern); err != nil {
-                       return
+                       return nil, nil
                }
                return []string{pattern}, nil
        }
index a1c8333f3793f7cec4075dc1bdaf330c5d567b9f..711e835fb7289fcd88e8aea453fb39085d11f0a3 100644 (file)
@@ -124,6 +124,16 @@ func TestGlob(t *testing.T) {
                        t.Errorf("Glob(%#q) = %#v want %v", tt.pattern, matches, tt.result)
                }
        }
+       for _, pattern := range []string{"no_match", "../*/no_match"} {
+               matches, err := Glob(pattern)
+               if err != nil {
+                       t.Errorf("Glob error for %q: %s", pattern, err)
+                       continue
+               }
+               if len(matches) != 0 {
+                       t.Errorf("Glob(%#q) = %#v want []", pattern, matches)
+               }
+       }
 }
 
 func TestGlobError(t *testing.T) {
index c9b099856517973166bef83fdd34238ea60331cc..1dc90f7ff4047662f65d79ff341280ebd7379222 100644 (file)
@@ -210,7 +210,8 @@ func ParseTemplateFiles(filenames ...string) (*Set, os.Error) {
 }
 
 // ParseTemplateGlob creates a set by parsing the files matched
-// by the pattern, each of which defines a single template. Each
+// by the pattern, each of which defines a single template. The pattern
+// is processed by filepath.Glob and must match at least one file. Each
 // template will be named the base name of its file.
 // Unlike with ParseGlob, each file should be a stand-alone template
 // definition suitable for Template.Parse (not Set.Parse); that is, the
@@ -225,6 +226,9 @@ func ParseTemplateGlob(pattern string) (*Set, os.Error) {
        if err != nil {
                return nil, err
        }
+       if len(filenames) == 0 {
+               return nil, fmt.Errorf("pattern matches no files: %#q", pattern)
+       }
        for _, filename := range filenames {
                t, err := ParseFile(filename)
                if err != nil {