Compare commits

...

2 Commits

Author SHA1 Message Date
Hajime Hoshi
0e6702c043 internal/file: update comments 2024-09-06 11:03:39 +09:00
Hajime Hoshi
e43bb3898b internal/file: bug fix: VirtualFS.Open(".") should always return a new entry
Closes #3081
2024-09-06 10:44:08 +09:00

View File

@ -29,15 +29,22 @@ import (
) )
type VirtualFS struct { type VirtualFS struct {
root virtualFSRoot paths []string
} }
func NewVirtualFS(paths []string) *VirtualFS { func NewVirtualFS(paths []string) *VirtualFS {
fs := &VirtualFS{} fs := &VirtualFS{}
fs.root.addRealPaths(paths) fs.paths = make([]string, len(paths))
copy(fs.paths, paths)
return fs return fs
} }
func (v *VirtualFS) newRootFS() *virtualFSRoot {
var root virtualFSRoot
root.addRealPaths(v.paths)
return &root
}
func (v *VirtualFS) Open(name string) (fs.File, error) { func (v *VirtualFS) Open(name string) (fs.File, error) {
if !fs.ValidPath(name) { if !fs.ValidPath(name) {
return nil, &fs.PathError{ return nil, &fs.PathError{
@ -48,15 +55,17 @@ func (v *VirtualFS) Open(name string) (fs.File, error) {
} }
if name == "." { if name == "." {
return &v.root, nil return v.newRootFS(), nil
} }
// A valid path must not include a token "." or "..", except for "." itself. // A valid path must not include a token "." or "..", except for "." itself.
es := strings.Split(name, "/") es := strings.Split(name, "/")
for _, realPath := range v.root.realPaths { for _, realPath := range v.paths {
if filepath.Base(realPath) != es[0] { if filepath.Base(realPath) != es[0] {
continue continue
} }
// os.File should implement fs.File interface, so this should be fine even on Windows.
// See https://cs.opensource.google/go/go/+/refs/tags/go1.23.0:src/os/file.go;l=695-710
return os.Open(filepath.Join(append([]string{realPath}, es[1:]...)...)) return os.Open(filepath.Join(append([]string{realPath}, es[1:]...)...))
} }