From 0333eab86660430f728bd7efb38ba798b5fe048a Mon Sep 17 00:00:00 2001 From: Felicitas Pojtinger Date: Tue, 21 Dec 2021 00:13:57 +0100 Subject: [PATCH] feat: Implement `Chown` for files and directories --- internal/fs/filesystem.go | 65 ++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/internal/fs/filesystem.go b/internal/fs/filesystem.go index d7f1a4a..b7692d7 100644 --- a/internal/fs/filesystem.go +++ b/internal/fs/filesystem.go @@ -1,6 +1,7 @@ package fs import ( + "archive/tar" "database/sql" "errors" "io" @@ -162,26 +163,7 @@ func (f *FileSystem) Stat(name string) (os.FileInfo, error) { return NewFileInfo(hdr), nil } -func (f *FileSystem) Chmod(name string, mode os.FileMode) error { - log.Println("FileSystem.Chmod", name, mode) - - 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) - +func (f *FileSystem) updateMetadata(hdr *tar.Header) error { done := false if _, err := f.writeOps.Update( func() (config.FileConfig, error) { @@ -207,10 +189,51 @@ func (f *FileSystem) Chmod(name string, mode os.FileMode) error { return nil } +func (f *FileSystem) Chmod(name string, mode os.FileMode) error { + log.Println("FileSystem.Chmod", name, mode) + + 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) + + return f.updateMetadata(hdr) +} + func (f *FileSystem) Chown(name string, uid, gid int) error { log.Println("FileSystem.Chown", name, uid, gid) - panic(ErrNotImplemented) + hdr, err := inventory.Stat( + f.metadata, + + name, + + f.onHeader, + ) + if err != nil { + if err == sql.ErrNoRows { + return os.ErrNotExist + } + + panic(err) + } + + hdr.Uid = uid + hdr.Gid = gid + + return f.updateMetadata(hdr) } func (f *FileSystem) Chtimes(name string, atime time.Time, mtime time.Time) error {