From 9f5c1b9818af926d181601485ca027babf55f57b Mon Sep 17 00:00:00 2001 From: Felicitas Pojtinger Date: Sat, 25 Dec 2021 20:44:27 +0100 Subject: [PATCH] fix: Add workaround for broken `Open` implementation in `CacheOnReadFs` (https://github.com/spf13/afero/issues/193) --- cmd/stfs/cmd/serve_ftp.go | 1 + cmd/stfs/cmd/serve_http.go | 5 +++-- internal/fs/filesystem.go | 27 ++++++++++++++++++++++++--- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/cmd/stfs/cmd/serve_ftp.go b/cmd/stfs/cmd/serve_ftp.go index 5dc5d8a..90e3620 100644 --- a/cmd/stfs/cmd/serve_ftp.go +++ b/cmd/stfs/cmd/serve_ftp.go @@ -203,6 +203,7 @@ var serveFTPCmd = &cobra.Command{ viper.GetString(cacheWriteFlag), ) }, + viper.GetString(cacheFileSystemFlag) != config.NoneKey, logger.PrintHeader, ) diff --git a/cmd/stfs/cmd/serve_http.go b/cmd/stfs/cmd/serve_http.go index 0feeebd..0cc1953 100644 --- a/cmd/stfs/cmd/serve_http.go +++ b/cmd/stfs/cmd/serve_http.go @@ -125,8 +125,9 @@ var serveHTTPCmd = &cobra.Command{ Metadata: metadataPersister, }, - "", // We never write - nil, // We never write + "", // We never write + nil, // We never write + false, // We never write logger.PrintHeader, ) diff --git a/internal/fs/filesystem.go b/internal/fs/filesystem.go index c86b453..11cf037 100644 --- a/internal/fs/filesystem.go +++ b/internal/fs/filesystem.go @@ -32,6 +32,7 @@ type FileSystem struct { compressionLevel string getFileBuffer func() (WriteCache, func() error, error) + enableHacks bool onHeader func(hdr *models.Header) } @@ -44,6 +45,7 @@ func NewFileSystem( compressionLevel string, getFileBuffer func() (WriteCache, func() error, error), + enableHacks bool, onHeader func(hdr *models.Header), ) afero.Fs { @@ -55,6 +57,7 @@ func NewFileSystem( compressionLevel: compressionLevel, getFileBuffer: getFileBuffer, + enableHacks: enableHacks, onHeader: onHeader, } @@ -185,10 +188,28 @@ func (f *FileSystem) Open(name string) (afero.File, error) { ) if err != nil { if err == sql.ErrNoRows { - return nil, os.ErrNotExist - } + // See https://github.com/spf13/afero/issues/193 + if f.enableHacks { + if err := f.mknode(false, name, os.ModePerm); err != nil { + return nil, err + } - panic(err) + hdr, err = inventory.Stat( + f.metadata, + + name, + + f.onHeader, + ) + if err != nil { + return nil, err + } + } else { + return nil, os.ErrNotExist + } + } else { + panic(err) + } } return NewFile(