Refactor merge.FS

This commit is contained in:
Deluan 2024-05-11 19:34:00 -04:00
parent 56809419c2
commit 955a9b43af
3 changed files with 11 additions and 11 deletions

View File

@ -8,7 +8,7 @@ import (
"sync" "sync"
"github.com/navidrome/navidrome/conf" "github.com/navidrome/navidrome/conf"
"github.com/navidrome/navidrome/utils" "github.com/navidrome/navidrome/utils/merge"
) )
var ( var (
@ -20,7 +20,7 @@ var (
func FS() fs.FS { func FS() fs.FS {
fsOnce.Do(func() { fsOnce.Do(func() {
fsys = utils.MergeFS{ fsys = merge.FS{
Base: embedFS, Base: embedFS,
Overlay: os.DirFS(path.Join(conf.Server.DataFolder, "resources")), Overlay: os.DirFS(path.Join(conf.Server.DataFolder, "resources")),
} }

View File

@ -1,4 +1,4 @@
package utils package merge
import ( import (
"errors" "errors"
@ -7,15 +7,15 @@ import (
"sort" "sort"
) )
// MergeFS implements a simple merged fs.FS, that can combine a Base FS with an Overlay FS. The semantics are: // FS implements a simple merged fs.FS, that can combine a Base FS with an Overlay FS. The semantics are:
// - Files from the Overlay FS will override files with the same name in the Base FS // - Files from the Overlay FS will override files 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 // - Directories are combined, with priority for the Overlay FS over the Base FS for files with matching names
type MergeFS struct { type FS struct {
Base fs.FS Base fs.FS
Overlay fs.FS Overlay fs.FS
} }
func (m MergeFS) Open(name string) (fs.File, error) { func (m FS) Open(name string) (fs.File, error) {
file, err := m.Overlay.Open(name) file, err := m.Overlay.Open(name)
if err != nil { if err != nil {
return m.Base.Open(name) return m.Base.Open(name)
@ -43,7 +43,7 @@ func (m MergeFS) Open(name string) (fs.File, error) {
return m.mergeDirs(name, info, baseDirFile, overlayDirFile) return m.mergeDirs(name, info, baseDirFile, overlayDirFile)
} }
func (m MergeFS) mergeDirs(name string, info fs.FileInfo, baseDir fs.ReadDirFile, overlayDir fs.ReadDirFile) (fs.File, error) { func (m FS) mergeDirs(name string, info fs.FileInfo, baseDir fs.ReadDirFile, overlayDir fs.ReadDirFile) (fs.File, error) {
merged := map[string]fs.DirEntry{} merged := map[string]fs.DirEntry{}
baseFiles, err := baseDir.ReadDir(-1) baseFiles, err := baseDir.ReadDir(-1)

View File

@ -1,4 +1,4 @@
package utils_test package merge_test
import ( import (
"io" "io"
@ -6,12 +6,12 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"github.com/navidrome/navidrome/utils" "github.com/navidrome/navidrome/utils/merge"
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
) )
var _ = Describe("MergeFS", func() { var _ = Describe("FS", func() {
var baseName, overlayName string var baseName, overlayName string
var mergedDir fs.FS var mergedDir fs.FS
@ -20,7 +20,7 @@ var _ = Describe("MergeFS", func() {
overlayName, _ = os.MkdirTemp("", "merge_fs_overlay_test") overlayName, _ = os.MkdirTemp("", "merge_fs_overlay_test")
baseDir := os.DirFS(baseName) baseDir := os.DirFS(baseName)
overlayDir := os.DirFS(overlayName) overlayDir := os.DirFS(overlayName)
mergedDir = utils.MergeFS{Base: baseDir, Overlay: overlayDir} mergedDir = merge.FS{Base: baseDir, Overlay: overlayDir}
}) })
AfterEach(func() { AfterEach(func() {
_ = os.RemoveAll(baseName) _ = os.RemoveAll(baseName)