aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2020-07-06 11:27:38 -0400
committerRuss Cox <rsc@golang.org>2020-10-20 17:52:48 +0000
commitb1f76f7a220a806d74bf55da374ea89467753e1f (patch)
treee207656767e10cacca21283cb45991306474d40d /src
parent90c924ff88a8b5ab65538ccc16d160922b1b4003 (diff)
downloadgo-b1f76f7a220a806d74bf55da374ea89467753e1f.tar.xz
os: add DirFS
It will inevitably be important to be able to pass an operating system directory to code written to expect an fs.FS. os.DirFS provides the conversion. For #41190. Change-Id: Id1a8fcbe4c7a30de2c47dea0504e9481a88b1b39 Reviewed-on: https://go-review.googlesource.com/c/go/+/243911 Trust: Russ Cox <rsc@golang.org> Reviewed-by: Rob Pike <r@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/os/file.go19
-rw-r--r--src/os/os_test.go7
2 files changed, 26 insertions, 0 deletions
diff --git a/src/os/file.go b/src/os/file.go
index 5f16fc28ee..835d44ab8c 100644
--- a/src/os/file.go
+++ b/src/os/file.go
@@ -45,6 +45,7 @@ import (
"internal/poll"
"internal/testlog"
"io"
+ "io/fs"
"runtime"
"syscall"
"time"
@@ -608,3 +609,21 @@ func isWindowsNulName(name string) bool {
}
return true
}
+
+// DirFS returns a file system (an fs.FS) for the tree of files rooted at the directory dir.
+func DirFS(dir string) fs.FS {
+ return dirFS(dir)
+}
+
+type dirFS string
+
+func (dir dirFS) Open(name string) (fs.File, error) {
+ if !fs.ValidPath(name) {
+ return nil, &PathError{Op: "open", Path: name, Err: ErrInvalid}
+ }
+ f, err := Open(string(dir) + "/" + name)
+ if err != nil {
+ return nil, err // nil fs.File
+ }
+ return f, nil
+}
diff --git a/src/os/os_test.go b/src/os/os_test.go
index 8f14263401..378ddf58dd 100644
--- a/src/os/os_test.go
+++ b/src/os/os_test.go
@@ -23,6 +23,7 @@ import (
"sync"
"syscall"
"testing"
+ "testing/fstest"
"time"
)
@@ -2671,3 +2672,9 @@ func TestOpenFileKeepsPermissions(t *testing.T) {
t.Errorf("Stat after OpenFile is %v, should be writable", fi.Mode())
}
}
+
+func TestDirFS(t *testing.T) {
+ if err := fstest.TestFS(DirFS("./signal"), "signal.go", "internal/pty/pty.go"); err != nil {
+ t.Fatal(err)
+ }
+}