From 42f334d677d5d50ba7ddca08a30451b33e78e61b Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor <iant@golang.org> Date: Thu, 27 Oct 2022 17:29:51 -0700 Subject: [PATCH] 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> --- src/os/file.go | 17 +++++++++-------- src/os/os_test.go | 6 +++++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/os/file.go b/src/os/file.go index e8d2de1b3cb..c46c9030b91 100644 --- a/src/os/file.go +++ b/src/os/file.go @@ -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 diff --git a/src/os/os_test.go b/src/os/os_test.go index 550b7db5a33..52fac4f63c4 100644 --- a/src/os/os_test.go +++ b/src/os/os_test.go @@ -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. -- GitLab