From 94a9e1f48c73f4634a1f088522c79e9810e5fb27 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Sun, 9 May 2021 04:02:16 +0000 Subject: [PATCH] Add ReadFile, interface guard, and drone CI (#2) Reviewed-on: https://git.jojodev.com/jolheiser/overlay/pulls/2 Co-authored-by: jolheiser Co-committed-by: jolheiser --- .drone.yml | 17 +++++++++++++++++ README.md | 3 +++ overlay.go | 21 +++++++++++++++++++++ overlay_test.go | 3 +-- 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 .drone.yml diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..7d4d631 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,17 @@ +--- +kind: pipeline +name: compliance +trigger: + event: + - pull_request +steps: + - name: build + pull: always + image: golang:1.16 + commands: + - make test + - name: check + pull: always + image: golang:1.16 + commands: + - make vet \ No newline at end of file diff --git a/README.md b/README.md index 2f32c46..4f0db5a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ # Overlay + +[![Build Status](https://ci.jojodev.com/api/badges/jolheiser/overlay/status.svg?ref=refs/heads/main)](https://ci.jojodev.com/jolheiser/overlay) + Overlay File System Overlay is an easy way to implement a file system in such a way that diff --git a/overlay.go b/overlay.go index 8dab55d..512bf1c 100644 --- a/overlay.go +++ b/overlay.go @@ -6,6 +6,10 @@ import ( "path" ) +// Interface guard +// fs.ReadFileFS also fulfills fs.FS +var _ fs.ReadFileFS = (*FS)(nil) + // FS is an overlay File System type FS struct { fs fs.FS @@ -39,6 +43,14 @@ func (f *FS) Open(name string) (fs.File, error) { return f.fs.Open(name) } +// ReadFile reads a file, preferring disk +func (f *FS) ReadFile(name string) ([]byte, error) { + if f.exists(name) { + return os.ReadFile(f.apn(name)) + } + return fs.ReadFile(f.fs, name) +} + // ReadDir reads []fs.DirEntry // This method will prefer EMBEDDED, because that is the "real" FS for overlay func (f *FS) ReadDir(name string) ([]fs.DirEntry, error) { @@ -66,6 +78,15 @@ func New(root string, fs fs.FS, opts ...Option) (*FS, error) { return x, nil } +// MustNew returns New and panics on error +func MustNew(root string, fs fs.FS, opts ...Option) *FS { + f, err := New(root, fs, opts...) + if err != nil { + panic(err) + } + return f +} + // WithSub sets a fs.Sub for an FS func WithSub(sub string) Option { return func(x *FS) (err error) { diff --git a/overlay_test.go b/overlay_test.go index 07ec8d2..80ce918 100644 --- a/overlay_test.go +++ b/overlay_test.go @@ -2,7 +2,6 @@ package overlay import ( "embed" - "io" "io/fs" "os" "strings" @@ -49,7 +48,7 @@ func TestOverlay(t *testing.T) { } defer fi.Close() - contents, err := io.ReadAll(fi) + contents, err := x.ReadFile(tc.File) if err != nil { t.Log(err) t.FailNow()