1
0
mirror of https://github.com/golang/go synced 2024-09-29 20:24:34 -06:00

os: don't include DirFS argument in DirFS errors

Otherwise we wind up mixing GOOS paths with slash separated paths.

Change-Id: I63dd733cbdb0668effbc030cfd58945008732d9e
Reviewed-on: https://go-review.googlesource.com/c/go/+/446115
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: Ian Lance Taylor <iant@google.com>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
Run-TryBot: Bryan Mills <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Auto-Submit: Ian Lance Taylor <iant@google.com>
This commit is contained in:
Ian Lance Taylor 2022-10-27 17:29:51 -07:00 committed by Gopher Robot
parent e59d873ff9
commit 42f334d677
2 changed files with 14 additions and 9 deletions

View File

@ -625,6 +625,7 @@ func DirFS(dir string) fs.FS {
return dirFS(dir)
}
// containsAny reports whether any bytes in chars are within s.
func containsAny(s, chars string) bool {
for i := 0; i < len(s); i++ {
for j := 0; j < len(chars); j++ {
@ -644,14 +645,12 @@ func (dir dirFS) Open(name string) (fs.File, error) {
}
f, err := Open(dir.join(name))
if err != nil {
if runtime.GOOS == "windows" {
// Undo the backslash conversion done by dir.join.
perr := err.(*PathError)
if containsAny(perr.Path, `\`) {
perr.Path = string(dir) + "/" + name
}
}
return nil, err // nil fs.File
// DirFS takes a string appropriate for GOOS,
// while the name argument here is always slash separated.
// dir.join will have mixed the two; undo that for
// error reporting.
err.(*PathError).Path = name
return nil, err
}
return f, nil
}
@ -662,6 +661,8 @@ func (dir dirFS) Stat(name string) (fs.FileInfo, error) {
}
f, err := Stat(dir.join(name))
if err != nil {
// See comment in dirFS.Open.
err.(*PathError).Path = name
return nil, err
}
return f, nil

View File

@ -2717,7 +2717,8 @@ func TestDirFS(t *testing.T) {
t.Fatal(err)
}
// Test that the error message does not contain a backslash.
// Test that the error message does not contain a backslash,
// and does not contain the DirFS argument.
const nonesuch = "dir/nonesuch"
_, err := fs.Open(nonesuch)
if err == nil {
@ -2726,6 +2727,9 @@ func TestDirFS(t *testing.T) {
if !strings.Contains(err.Error(), nonesuch) {
t.Errorf("error %q does not contain %q", err, nonesuch)
}
if strings.Contains(err.Error(), "testdata") {
t.Errorf("error %q contains %q", err, "testdata")
}
}
// Test that Open does not accept backslash as separator.