Allow SeekStart in a merged dir

This commit is contained in:
Deluan 2020-07-23 22:00:59 -04:00
parent 72efc18158
commit b795ad55a3
2 changed files with 17 additions and 9 deletions

View File

@ -8,19 +8,23 @@ import (
"sort" "sort"
) )
type MergeFS struct { // NewMergeFS returns a simple implementation of a merged FS (http.FileSystem), that can combine a base FS with a
base http.FileSystem // overlay FS. The semantics are:
overlay http.FileSystem // - Files from the overlay FS will override file s with the same name in the base FS
} // - Directories are combined, with priority for the overlay FS over the base FS for files with matching names
func NewMergeFS(base, overlay http.FileSystem) http.FileSystem { func NewMergeFS(base, overlay http.FileSystem) http.FileSystem {
return &MergeFS{ return &mergeFS{
base: base, base: base,
overlay: overlay, overlay: overlay,
} }
} }
func (m MergeFS) Open(name string) (http.File, error) { type mergeFS struct {
base http.FileSystem
overlay http.FileSystem
}
func (m mergeFS) Open(name string) (http.File, error) {
f, err := m.overlay.Open(name) f, err := m.overlay.Open(name)
if err != nil { if err != nil {
return m.base.Open(name) return m.base.Open(name)
@ -44,7 +48,7 @@ func (m MergeFS) Open(name string) (http.File, error) {
return m.mergeDirs(name, info, baseDir, f) return m.mergeDirs(name, info, baseDir, f)
} }
func (m MergeFS) mergeDirs(name string, info os.FileInfo, baseDir http.File, overlayDir http.File) (http.File, error) { func (m mergeFS) mergeDirs(name string, info os.FileInfo, baseDir http.File, overlayDir http.File) (http.File, error) {
merged := map[string]os.FileInfo{} merged := map[string]os.FileInfo{}
baseFiles, err := baseDir.Readdir(-1) baseFiles, err := baseDir.Readdir(-1)
@ -104,5 +108,9 @@ func (d mergedDir) Read(p []byte) (n int, err error) {
return 0, fmt.Errorf("cannot Read from directory %s", d.name) return 0, fmt.Errorf("cannot Read from directory %s", d.name)
} }
func (d mergedDir) Seek(offset int64, whence int) (int64, error) { func (d mergedDir) Seek(offset int64, whence int) (int64, error) {
if offset == 0 && whence == io.SeekStart {
d.pos = 0
return 0, nil
}
return 0, fmt.Errorf("unsupported Seek in directory %s", d.name) return 0, fmt.Errorf("unsupported Seek in directory %s", d.name)
} }

View File

@ -11,7 +11,7 @@ import (
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
) )
var _ = Describe("MergeFS", func() { var _ = Describe("mergeFS", func() {
var baseName, overlayName string var baseName, overlayName string
var baseDir, overlayDir, mergedDir http.FileSystem var baseDir, overlayDir, mergedDir http.FileSystem