From 30c2e54c25f6c3a942080f30be49712adda27586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 8 Apr 2022 15:15:26 +0200 Subject: Replace all usage of CopyOnWriteFs with OverlayFs Fixes #9761 --- hugofs/language_composite_fs.go | 81 ----------------------------------------- hugofs/language_merge.go | 39 ++++++++++++++++++++ hugofs/noop_fs.go | 8 ++-- 3 files changed, 43 insertions(+), 85 deletions(-) delete mode 100644 hugofs/language_composite_fs.go create mode 100644 hugofs/language_merge.go (limited to 'hugofs') diff --git a/hugofs/language_composite_fs.go b/hugofs/language_composite_fs.go deleted file mode 100644 index 9b4bc4cfd..000000000 --- a/hugofs/language_composite_fs.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2018 The Hugo Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package hugofs - -import ( - "os" - - "github.com/spf13/afero" -) - -var ( - _ afero.Fs = (*languageCompositeFs)(nil) - _ afero.Lstater = (*languageCompositeFs)(nil) - _ FilesystemsUnwrapper = (*languageCompositeFs)(nil) -) - -type languageCompositeFs struct { - base afero.Fs - overlay afero.Fs - *afero.CopyOnWriteFs -} - -// NewLanguageCompositeFs creates a composite and language aware filesystem. -// 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, overlay afero.Fs) afero.Fs { - return &languageCompositeFs{base, overlay, afero.NewCopyOnWriteFs(base, overlay).(*afero.CopyOnWriteFs)} -} - -func (fs *languageCompositeFs) UnwrapFilesystems() []afero.Fs { - return []afero.Fs{fs.base, fs.overlay} -} - -// Open takes the full path to the file in the target filesystem. If it is a directory, it gets merged -// using the language as a weight. -func (fs *languageCompositeFs) Open(name string) (afero.File, error) { - f, err := fs.CopyOnWriteFs.Open(name) - if err != nil { - return nil, err - } - - fu, ok := f.(*afero.UnionFile) - if ok { - // This is a directory: Merge it. - fu.Merger = LanguageDirsMerger - } - 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) { - for _, fi1 := range bofi { - fim1 := fi1.(FileMetaInfo) - var found bool - for _, fi2 := range lofi { - fim2 := fi2.(FileMetaInfo) - if fi1.Name() == fi2.Name() && fim1.Meta().Lang == fim2.Meta().Lang { - found = true - break - } - } - if !found { - lofi = append(lofi, fi1) - } - } - - return lofi, nil -} diff --git a/hugofs/language_merge.go b/hugofs/language_merge.go new file mode 100644 index 000000000..a2fa411a9 --- /dev/null +++ b/hugofs/language_merge.go @@ -0,0 +1,39 @@ +// Copyright 2022 The Hugo Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package hugofs + +import ( + "os" +) + +// LanguageDirsMerger implements the overlayfs.DirsMerger func, which is used +// to merge two directories. +var LanguageDirsMerger = func(lofi, bofi []os.FileInfo) []os.FileInfo { + for _, fi1 := range bofi { + fim1 := fi1.(FileMetaInfo) + var found bool + for _, fi2 := range lofi { + fim2 := fi2.(FileMetaInfo) + if fi1.Name() == fi2.Name() && fim1.Meta().Lang == fim2.Meta().Lang { + found = true + break + } + } + if !found { + lofi = append(lofi, fi1) + } + } + + return lofi +} diff --git a/hugofs/noop_fs.go b/hugofs/noop_fs.go index 12b4e937e..8e4abbc6b 100644 --- a/hugofs/noop_fs.go +++ b/hugofs/noop_fs.go @@ -38,11 +38,11 @@ func (fs noOpFs) Create(name string) (afero.File, error) { } func (fs noOpFs) Mkdir(name string, perm os.FileMode) error { - return errNoOp + return nil } func (fs noOpFs) MkdirAll(path string, perm os.FileMode) error { - return errNoOp + return nil } func (fs noOpFs) Open(name string) (afero.File, error) { @@ -54,11 +54,11 @@ func (fs noOpFs) OpenFile(name string, flag int, perm os.FileMode) (afero.File, } func (fs noOpFs) Remove(name string) error { - return errNoOp + return nil } func (fs noOpFs) RemoveAll(path string) error { - return errNoOp + return nil } func (fs noOpFs) Rename(oldname string, newname string) error { -- cgit v1.2.3