From 793b04340e0b58b429a9cf5b5ada5b107f89d256 Mon Sep 17 00:00:00 2001 From: Jonas Kaninda Date: Fri, 6 Dec 2024 16:25:16 +0100 Subject: [PATCH] refactor: refactoring of code to meet all go lint requirements --- .github/workflows/lint.yml | 23 ++++++++++++++++++++ .golangci.yml | 44 ++++++++++++++++++++++++++++++++++++++ go.mod | 2 +- pkg/azure/azure.go | 4 ++-- pkg/ftp/ftp.go | 35 +++++++++++++++++++++++++----- pkg/local/local.go | 12 +++++++++-- pkg/local/local_test.go | 7 +++++- pkg/s3/s3.go | 20 ++++++++++++++--- pkg/ssh/ssh.go | 7 +++++- pkg/storage.go | 4 ++-- 10 files changed, 141 insertions(+), 17 deletions(-) create mode 100644 .github/workflows/lint.yml create mode 100644 .golangci.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..f40d365 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,23 @@ +name: Lint + +on: + push: + pull_request: + +jobs: + lint: + name: Run on Ubuntu + runs-on: ubuntu-latest + steps: + - name: Clone the code + uses: actions/checkout@v4 + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: '~1.22' + + - name: Run linter + uses: golangci/golangci-lint-action@v6 + with: + version: v1.61 diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..ae8a9cf --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,44 @@ +run: + timeout: 5m + allow-parallel-runners: true + +issues: + # don't skip warning about doc comments + # don't exclude the default set of lint + exclude-use-default: false + # restore some of the defaults + # (fill in the rest as needed) + exclude-rules: + - path: "internal/*" + linters: + - dupl + - lll + - goimports +linters: + disable-all: true + enable: + - dupl + - errcheck + - copyloopvar + - ginkgolinter + - goconst + - gocyclo + - gofmt + - gosimple + - govet + - ineffassign + # - lll + - misspell + - nakedret + - prealloc + - revive + - staticcheck + - typecheck + - unconvert + - unparam + - unused + +linters-settings: + revive: + rules: + - name: comment-spacings diff --git a/go.mod b/go.mod index 0a91abd..4721c1a 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/jkaninda/go-storage -go 1.21.0 +go 1.22.0 require ( github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.5.0 diff --git a/pkg/azure/azure.go b/pkg/azure/azure.go index cc194b9..88dcab3 100644 --- a/pkg/azure/azure.go +++ b/pkg/azure/azure.go @@ -55,12 +55,12 @@ func createClient(conf Config) (*azblob.Client, error) { // Create the service URL credential, err := azblob.NewSharedKeyCredential(conf.AccountName, conf.AccountKey) if err != nil { - log.Fatalf("Failed to create credential: %v", err) + return nil, fmt.Errorf("failed to create service URL") } serviceURL := fmt.Sprintf("https://%s.blob.core.windows.net/", conf.AccountName) client, err := azblob.NewClientWithSharedKeyCredential(serviceURL, credential, nil) if err != nil { - log.Fatalf("Failed to create client: %v", err) + return nil, fmt.Errorf("failed to create client") } return client, nil } diff --git a/pkg/ftp/ftp.go b/pkg/ftp/ftp.go index 57d49f0..f8cb165 100644 --- a/pkg/ftp/ftp.go +++ b/pkg/ftp/ftp.go @@ -82,14 +82,24 @@ func NewStorage(conf Config) (pkg.Storage, error) { // Copy copies file to the remote server func (s ftpStorage) Copy(fileName string) error { ftpClient := s.client - defer ftpClient.Quit() + defer func(ftpClient *ftp.ServerConn) { + err := ftpClient.Quit() + if err != nil { + return + } + }(ftpClient) filePath := filepath.Join(s.LocalPath, fileName) file, err := os.Open(filePath) if err != nil { return fmt.Errorf("failed to open file %s: %w", fileName, err) } - defer file.Close() + defer func(file *os.File) { + err := file.Close() + if err != nil { + return + } + }(file) remoteFilePath := filepath.Join(s.RemotePath, fileName) err = ftpClient.Stor(remoteFilePath, file) @@ -104,21 +114,36 @@ func (s ftpStorage) Copy(fileName string) error { func (s ftpStorage) CopyFrom(fileName string) error { ftpClient := s.client - defer ftpClient.Quit() + defer func(ftpClient *ftp.ServerConn) { + err := ftpClient.Quit() + if err != nil { + return + } + }(ftpClient) remoteFilePath := filepath.Join(s.RemotePath, fileName) r, err := ftpClient.Retr(remoteFilePath) if err != nil { return fmt.Errorf("failed to retrieve file %s: %w", fileName, err) } - defer r.Close() + defer func(r *ftp.Response) { + err := r.Close() + if err != nil { + return + } + }(r) localFilePath := filepath.Join(s.LocalPath, fileName) outFile, err := os.Create(localFilePath) if err != nil { return fmt.Errorf("failed to create local file %s: %w", fileName, err) } - defer outFile.Close() + defer func(outFile *os.File) { + err := outFile.Close() + if err != nil { + return + } + }(outFile) _, err = io.Copy(outFile, r) if err != nil { diff --git a/pkg/local/local.go b/pkg/local/local.go index 58f86a1..0386446 100644 --- a/pkg/local/local.go +++ b/pkg/local/local.go @@ -116,7 +116,12 @@ func copyFile(src, dst string) error { if err != nil { return err } - defer in.Close() + defer func(in *os.File) { + err := in.Close() + if err != nil { + return + } + }(in) out, err := os.Create(dst) if err != nil { @@ -125,7 +130,10 @@ func copyFile(src, dst string) error { _, err = io.Copy(out, in) if err != nil { - out.Close() + err := out.Close() + if err != nil { + return err + } return err } return out.Close() diff --git a/pkg/local/local_test.go b/pkg/local/local_test.go index 73336ee..fce970c 100644 --- a/pkg/local/local_test.go +++ b/pkg/local/local_test.go @@ -45,7 +45,12 @@ func createFile(fileName, content string) ([]byte, error) { fmt.Println("Error creating file:", err) return nil, err } - defer file.Close() + defer func(file *os.File) { + err := file.Close() + if err != nil { + return + } + }(file) // Write the message to the file _, err = file.WriteString(content) diff --git a/pkg/s3/s3.go b/pkg/s3/s3.go index 3965472..3695372 100644 --- a/pkg/s3/s3.go +++ b/pkg/s3/s3.go @@ -94,7 +94,12 @@ func (s s3Storage) Copy(fileName string) error { if err != nil { return err } - defer file.Close() + defer func(file *os.File) { + err := file.Close() + if err != nil { + return + } + }(file) fileInfo, err := file.Stat() if err != nil { @@ -102,7 +107,10 @@ func (s s3Storage) Copy(fileName string) error { } objectKey := filepath.Join(s.RemotePath, fileName) buffer := make([]byte, fileInfo.Size()) - file.Read(buffer) + _, err = file.Read(buffer) + if err != nil { + return err + } fileBytes := bytes.NewReader(buffer) fileType := http.DetectContentType(buffer) @@ -126,7 +134,13 @@ func (s s3Storage) CopyFrom(fileName string) error { if err != nil { return err } - defer file.Close() + defer func(file *os.File) { + err := file.Close() + if err != nil { + fmt.Printf("Error closing file: %v\n", err) + return + } + }(file) objectKey := filepath.Join(s.RemotePath, fileName) diff --git a/pkg/ssh/ssh.go b/pkg/ssh/ssh.go index fa83a89..367d9bd 100644 --- a/pkg/ssh/ssh.go +++ b/pkg/ssh/ssh.go @@ -121,7 +121,12 @@ func (s sshStorage) CopyFrom(fileName string) error { if err != nil { return errors.New("couldn't open the output file") } - defer file.Close() + defer func(file *os.File) { + err := file.Close() + if err != nil { + return + } + }(file) err = client.CopyFromRemote(context.Background(), file, filepath.Join(s.RemotePath, fileName)) diff --git a/pkg/storage.go b/pkg/storage.go index 0d7f6e3..8e68b44 100644 --- a/pkg/storage.go +++ b/pkg/storage.go @@ -31,8 +31,8 @@ type Storage interface { Name() string } type Backend struct { - //Local Path + // Local Path LocalPath string - //Remote path or Destination path + // Remote path or Destination path RemotePath string }