]> Cypherpunks repositories - gostls13.git/commitdiff
path/filepath: fix escaped chars in Glob on non-Windows
authorDaniel Martí <mvdan@mvdan.cc>
Thu, 11 Jan 2018 20:23:22 +0000 (20:23 +0000)
committerDaniel Martí <mvdan@mvdan.cc>
Wed, 14 Feb 2018 11:47:59 +0000 (11:47 +0000)
Backslashes are ignored in Match and Glob on Windows, since those
collide with the separator character. However, they should still work in
both functions on other operating systems.

hasMeta did not reflect this logic - it always treated a backslash as a
non-special character. Do that only on Windows.

Assuming this is what the TODO was referring to, remove it. There are no
other characters that scanChunk treats especially.

Fixes #23418.

Change-Id: Ie0bd795812e0ed9d8c8c1bbc3137f29d960cba84
Reviewed-on: https://go-review.googlesource.com/87455
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/path/filepath/match.go
src/path/filepath/match_test.go

index 057f7f36774bcefb2e43529ce365ec9e2f65afd1..46badb5e840ba74b35a9f57dcfd4969f6cc23710 100644 (file)
@@ -339,6 +339,9 @@ func glob(dir, pattern string, matches []string) (m []string, e error) {
 // hasMeta reports whether path contains any of the magic characters
 // recognized by Match.
 func hasMeta(path string) bool {
-       // TODO(niemeyer): Should other magic characters be added here?
-       return strings.ContainsAny(path, "*?[")
+       magicChars := `*?[`
+       if runtime.GOOS != "windows" {
+               magicChars = `*?[\`
+       }
+       return strings.ContainsAny(path, magicChars)
 }
index 18d38bf5bb3c65939b15346692cef21e9c79b58d..1d91c274c75966c76f61ef314171e92012b1192c 100644 (file)
@@ -10,6 +10,7 @@ import (
        "io/ioutil"
        "os"
        . "path/filepath"
+       "reflect"
        "runtime"
        "sort"
        "strings"
@@ -371,3 +372,18 @@ func TestWindowsGlob(t *testing.T) {
                }
        }
 }
+
+func TestNonWindowsGlobEscape(t *testing.T) {
+       if runtime.GOOS == "windows" {
+               t.Skipf("skipping non-windows specific test")
+       }
+       pattern := `\match.go`
+       want := []string{"match.go"}
+       matches, err := Glob(pattern)
+       if err != nil {
+               t.Fatalf("Glob error for %q: %s", pattern, err)
+       }
+       if !reflect.DeepEqual(matches, want) {
+               t.Fatalf("Glob(%#q) = %v want %v", pattern, matches, want)
+       }
+}