From 09b79d49dc7b5cbbaf0e7cc7e31ab9b776571690 Mon Sep 17 00:00:00 2001 From: Kadu Artur Prussek Date: Thu, 7 May 2020 17:15:33 -0300 Subject: [PATCH 1/2] Move the fileutil to stream package --- pkg/stream/dir.go | 50 +++++++++++++++++++++ pkg/stream/file.go | 84 ++++++++++++++++++++++++++++++++++++ pkg/stream/streams/stream.go | 51 ++++++++++++++++++++++ 3 files changed, 185 insertions(+) create mode 100644 pkg/stream/dir.go create mode 100644 pkg/stream/file.go create mode 100644 pkg/stream/streams/stream.go diff --git a/pkg/stream/dir.go b/pkg/stream/dir.go new file mode 100644 index 000000000..4c22dfb1d --- /dev/null +++ b/pkg/stream/dir.go @@ -0,0 +1,50 @@ +package stream + +import ( + "fmt" + "os" +) + +type DirCreater interface { + Create(dir string) error +} + +type DirRemover interface { + Remove(dir string) error +} + +// CreateDir implements DirCreater +type CreateDir struct { +} + +// NewDirCreater returns a CreateDir +func NewDirCreater() CreateDir { + return CreateDir{} +} + +// Create creates a directory named dir +// A successful call returns err == nil +func (c CreateDir) Create(dir string) error { + if err := os.MkdirAll(dir, os.ModePerm); err != nil { + return fmt.Errorf("failed to create directory: '%s', error: '%s'", dir, err.Error()) + } + + return nil +} + +// RemoveDir implements DirRemover +type RemoveDir struct { +} + +// NewDirRemover returns a RemoveDir +func NewDirRemover() RemoveDir { + return RemoveDir{} +} + +// Remove removes dir and any children it contains. +func (r RemoveDir) Remove(dir string) error { + if err := os.RemoveAll(dir); err != nil { + return err + } + return nil +} diff --git a/pkg/stream/file.go b/pkg/stream/file.go new file mode 100644 index 000000000..9ffdcb66f --- /dev/null +++ b/pkg/stream/file.go @@ -0,0 +1,84 @@ +package stream + +import ( + "io/ioutil" + "os" +) + +type FileExister interface { + Exists(path string) bool +} + +type FileReader interface { + Read(path string) ([]byte, error) +} + +type FileWriter interface { + Write(path string, content []byte) error +} + +type FileRemover interface { + Remove(path string) error +} + +type FileReadExister interface { + FileReader + FileExister +} + +type FileWriteReadExister interface { + FileWriter + FileReader + FileExister +} + +type FileWriteReadExistRemover interface { + FileWriter + FileReader + FileExister + FileRemover +} + +// FileManager implements FileWriteReadExistRemover +type FileManager struct { +} + +// NewFileManager returns a FileManage that writes from w +// reads from r, exists from e and removes from re +func NewFileManager() FileManager { + return FileManager{} +} + +// Read reads the file named by path and returns the contents. +// A successful call returns err == nil +func (f FileManager) Read(path string) ([]byte, error) { + b, err := ioutil.ReadFile(path) + if err != nil && !os.IsNotExist(err) { + return nil, err + } + + return b, err +} + +// Exists returns true if file path exists +func (f FileManager) Exists(path string) bool { + if _, err := os.Stat(path); os.IsNotExist(err) { + return false + } + + return true +} + +// Write writes content to a file named by path. +// A successful call returns err == nil +func (f FileManager) Write(path string, content []byte) error { + return ioutil.WriteFile(path, content, os.ModePerm) +} + +// Remove removes the named file +func (f FileManager) Remove(path string) error { + if f.Exists(path) { + return os.Remove(path) + } + return nil +} diff --git a/pkg/stream/streams/stream.go b/pkg/stream/streams/stream.go new file mode 100644 index 000000000..02db448e1 --- /dev/null +++ b/pkg/stream/streams/stream.go @@ -0,0 +1,51 @@ +package streams + +import ( + "archive/zip" + "io" + "log" + "os" + "path/filepath" +) + +// Unzip wrapper for archive.zip +func Unzip(src string, dest string) error { + reader, _ := zip.OpenReader(src) + for _, file := range reader.Reader.File { + + zippedFile, err := file.Open() + if err != nil { + return err + } + defer zippedFile.Close() + + extractedFilePath := filepath.Join( + dest, + file.Name, + ) + + if file.FileInfo().IsDir() { + log.Println("Directory Created:", extractedFilePath) + os.MkdirAll(extractedFilePath, file.Mode()) + } else { + log.Println("File extracted:", file.Name) + + outputFile, err := os.OpenFile( + extractedFilePath, + os.O_WRONLY|os.O_CREATE|os.O_TRUNC, + file.Mode(), + ) + if err != nil { + return err + } + defer outputFile.Close() + + _, err = io.Copy(outputFile, zippedFile) + if err != nil { + return err + } + } + } + defer reader.Close() + return nil +} From 0f2118815b02380d6b6e3ac61cc61e147b6c4855 Mon Sep 17 00:00:00 2001 From: Kadu Artur Prussek Date: Thu, 7 May 2020 17:27:55 -0300 Subject: [PATCH 2/2] Fix lint --- pkg/stream/streams/stream.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/stream/streams/stream.go b/pkg/stream/streams/stream.go index 02db448e1..f41a119e4 100644 --- a/pkg/stream/streams/stream.go +++ b/pkg/stream/streams/stream.go @@ -26,7 +26,9 @@ func Unzip(src string, dest string) error { if file.FileInfo().IsDir() { log.Println("Directory Created:", extractedFilePath) - os.MkdirAll(extractedFilePath, file.Mode()) + if err := os.MkdirAll(extractedFilePath, file.Mode()); err != nil { + return err + } } else { log.Println("File extracted:", file.Name)