diff options
Diffstat (limited to 'hugofs/language_composite_fs.go')
-rw-r--r-- | hugofs/language_composite_fs.go | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/hugofs/language_composite_fs.go b/hugofs/language_composite_fs.go index 2889f8a00..5dbd252c0 100644 --- a/hugofs/language_composite_fs.go +++ b/hugofs/language_composite_fs.go @@ -14,6 +14,9 @@ package hugofs import ( + "os" + "path" + "github.com/spf13/afero" ) @@ -30,8 +33,8 @@ type languageCompositeFs struct { // This is a hybrid filesystem. To get a specific file in Open, Stat etc., use the full filename // to the target filesystem. This information is available in Readdir, Stat etc. via the // special LanguageFileInfo FileInfo implementation. -func NewLanguageCompositeFs(base afero.Fs, overlay *LanguageFs) afero.Fs { - return afero.NewReadOnlyFs(&languageCompositeFs{afero.NewCopyOnWriteFs(base, overlay).(*afero.CopyOnWriteFs)}) +func NewLanguageCompositeFs(base, overlay afero.Fs) afero.Fs { + return &languageCompositeFs{afero.NewCopyOnWriteFs(base, overlay).(*afero.CopyOnWriteFs)} } // Open takes the full path to the file in the target filesystem. If it is a directory, it gets merged @@ -49,3 +52,36 @@ func (fs *languageCompositeFs) Open(name string) (afero.File, error) { } return f, nil } + +// LanguageDirsMerger implements the afero.DirsMerger interface, which is used +// to merge two directories. +var LanguageDirsMerger = func(lofi, bofi []os.FileInfo) ([]os.FileInfo, error) { + m := make(map[string]FileMetaInfo) + + getKey := func(fim FileMetaInfo) string { + return path.Join(fim.Meta().Lang(), fim.Name()) + } + + for _, fi := range lofi { + fim := fi.(FileMetaInfo) + m[getKey(fim)] = fim + } + + for _, fi := range bofi { + fim := fi.(FileMetaInfo) + key := getKey(fim) + _, found := m[key] + if !found { + m[key] = fim + } + } + + merged := make([]os.FileInfo, len(m)) + i := 0 + for _, v := range m { + merged[i] = v + i++ + } + + return merged, nil +} |