From a9e8040623aa1682d456dcc9bf278484de8ee73b Mon Sep 17 00:00:00 2001 From: Felicitas Pojtinger Date: Mon, 20 Dec 2021 23:54:43 +0100 Subject: [PATCH] feat: Implement `Chmod` for files and directories --- cmd/stfs/cmd/serve_ftp.go | 2 ++ cmd/stfs/cmd/serve_http.go | 2 ++ internal/fs/filesystem.go | 49 +++++++++++++++++++++++++++++++++++++- 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/cmd/stfs/cmd/serve_ftp.go b/cmd/stfs/cmd/serve_ftp.go index 0eb8ab5..ac90b3a 100644 --- a/cmd/stfs/cmd/serve_ftp.go +++ b/cmd/stfs/cmd/serve_ftp.go @@ -186,6 +186,8 @@ var serveFTPCmd = &cobra.Command{ Metadata: metadataPersister, }, + viper.GetString(compressionLevelFlag), + logger.PrintHeader, ) diff --git a/cmd/stfs/cmd/serve_http.go b/cmd/stfs/cmd/serve_http.go index 1f842d0..6e87874 100644 --- a/cmd/stfs/cmd/serve_http.go +++ b/cmd/stfs/cmd/serve_http.go @@ -126,6 +126,8 @@ var serveHTTPCmd = &cobra.Command{ Metadata: metadataPersister, }, + "", // We never write + logger.PrintHeader, ) diff --git a/internal/fs/filesystem.go b/internal/fs/filesystem.go index 1859201..d7f1a4a 100644 --- a/internal/fs/filesystem.go +++ b/internal/fs/filesystem.go @@ -3,9 +3,11 @@ package fs import ( "database/sql" "errors" + "io" "log" "os" "path" + "path/filepath" "time" models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" @@ -25,6 +27,8 @@ type FileSystem struct { metadata config.MetadataConfig + compressionLevel string + onHeader func(hdr *models.Header) } @@ -34,6 +38,8 @@ func NewFileSystem( metadata config.MetadataConfig, + compressionLevel string, + onHeader func(hdr *models.Header), ) afero.Fs { return &FileSystem{ @@ -42,6 +48,8 @@ func NewFileSystem( metadata: metadata, + compressionLevel: compressionLevel, + onHeader: onHeader, } } @@ -157,7 +165,46 @@ func (f *FileSystem) Stat(name string) (os.FileInfo, error) { func (f *FileSystem) Chmod(name string, mode os.FileMode) error { log.Println("FileSystem.Chmod", name, mode) - panic(ErrNotImplemented) + hdr, err := inventory.Stat( + f.metadata, + + name, + + f.onHeader, + ) + if err != nil { + if err == sql.ErrNoRows { + return os.ErrNotExist + } + + panic(err) + } + + hdr.Mode = int64(mode) + + done := false + if _, err := f.writeOps.Update( + func() (config.FileConfig, error) { + // Exit after the first update + if done { + return config.FileConfig{}, io.EOF + } + done = true + + return config.FileConfig{ + GetFile: nil, // Not required as we never replace + Info: hdr.FileInfo(), + Path: filepath.ToSlash(hdr.Name), + Link: filepath.ToSlash(hdr.Linkname), + }, nil + }, + f.compressionLevel, + false, + ); err != nil { + return err + } + + return nil } func (f *FileSystem) Chown(name string, uid, gid int) error {