diff --git a/internal/fs/filesystem.go b/internal/fs/filesystem.go index 390a26f..b92901c 100644 --- a/internal/fs/filesystem.go +++ b/internal/fs/filesystem.go @@ -66,11 +66,11 @@ func (f *FileSystem) Name() string { func (f *FileSystem) Create(name string) (afero.File, error) { log.Println("FileSystem.Name", name) - panic(ErrNotImplemented) + return os.OpenFile(name, os.O_CREATE, 0666) } -func (f *FileSystem) Mkdir(name string, perm os.FileMode) error { - log.Println("FileSystem.Mkdir", name, perm) +func (f *FileSystem) mknode(dir bool, name string, perm os.FileMode) error { + log.Println("FileSystem.mknode", name, perm) usr, err := user.Current() if err != nil { @@ -97,8 +97,13 @@ func (f *FileSystem) Mkdir(name string, perm os.FileMode) error { gname = groups[0] } + typeflag := tar.TypeReg + if dir { + typeflag = tar.TypeDir + } + hdr := &tar.Header{ - Typeflag: tar.TypeDir, + Typeflag: byte(typeflag), Name: name, @@ -136,6 +141,12 @@ func (f *FileSystem) Mkdir(name string, perm os.FileMode) error { return nil } +func (f *FileSystem) Mkdir(name string, perm os.FileMode) error { + log.Println("FileSystem.Mkdir", name, perm) + + return f.mknode(true, name, perm) +} + func (f *FileSystem) MkdirAll(path string, perm os.FileMode) error { log.Println("FileSystem.MkdirAll", path, perm) @@ -149,7 +160,7 @@ func (f *FileSystem) MkdirAll(path string, perm os.FileMode) error { currentPath = filepath.Join(currentPath, part) } - if err := f.Mkdir(currentPath, perm); err != nil { + if err := f.mknode(true, currentPath, perm); err != nil { return err } } @@ -192,13 +203,16 @@ func (f *FileSystem) Open(name string) (afero.File, error) { func (f *FileSystem) OpenFile(name string, flag int, perm os.FileMode) (afero.File, error) { log.Println("FileSystem.OpenFile", name, flag, perm) - if flag != 0 { - // TODO: Implement update and write - panic(ErrNotImplemented) + if _, err := f.Stat(name); err != nil { + if err == os.ErrNotExist && flag&os.O_CREATE != 0 { + if err := f.mknode(false, name, perm); err != nil { + return nil, err + } + } else { + return nil, err + } } - // TODO: Implement `perm` support - return f.Open(name) } diff --git a/pkg/operations/archive.go b/pkg/operations/archive.go index 278b69a..061dfb7 100644 --- a/pkg/operations/archive.go +++ b/pkg/operations/archive.go @@ -79,7 +79,7 @@ func (o *Operations) Archive( hdr.Format = tar.FormatPAX var f io.ReadSeekCloser - if file.Info.Mode().IsRegular() { + if file.Info.Mode().IsRegular() && file.Info.Size() > 0 { // Get the compressed size for the header fileSizeCounter := &ioext.CounterWriter{ Writer: io.Discard, @@ -184,7 +184,7 @@ func (o *Operations) Archive( dirty = true - if !file.Info.Mode().IsRegular() { + if !file.Info.Mode().IsRegular() || file.Info.Size() <= 0 { if f != nil { if err := f.Close(); err != nil { return []*tar.Header{}, err diff --git a/pkg/operations/update.go b/pkg/operations/update.go index 9d3f221..5843786 100644 --- a/pkg/operations/update.go +++ b/pkg/operations/update.go @@ -75,7 +75,7 @@ func (o *Operations) Update( hdr.PAXRecords[records.STFSRecordAction] = records.STFSRecordActionUpdate var f io.ReadSeekCloser - if file.Info.Mode().IsRegular() && replace { + if file.Info.Mode().IsRegular() && replace && file.Info.Size() > 0 { // Get the compressed size for the header fileSizeCounter := &ioext.CounterWriter{ Writer: io.Discard, @@ -183,7 +183,7 @@ func (o *Operations) Update( dirty = true - if !file.Info.Mode().IsRegular() { + if !file.Info.Mode().IsRegular() || file.Info.Size() <= 0 { if f != nil { if err := f.Close(); err != nil { return []*tar.Header{}, err