diff options
author | Daniel Milde <daniel@milde.cz> | 2024-05-02 10:44:15 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-02 10:44:15 +0200 |
commit | bed973b05fc566fd332be8bf423e17aa09e33b04 (patch) | |
tree | a4493265ce4531ebf4b55901966fa3d399aaa976 | |
parent | 8902628f416af389a44848991f368426917427d4 (diff) | |
parent | e887e2cf64ba8754ca020a55a48f1d5f2aa35a38 (diff) |
Merge pull request #355 from dundee/dundee/refactor/lint
refactor: lint fixes
35 files changed, 230 insertions, 89 deletions
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5b70e96..c70bf21 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,9 +18,9 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - name: Run linters - uses: golangci/golangci-lint-action@v4 + uses: golangci/golangci-lint-action@v5 with: - version: v1.45 + version: v1.57.2 test: strategy: diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..e5e9a87 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,122 @@ +linters-settings: + errcheck: + check-blank: true + revive: + rules: + - name: blank-imports + - name: context-as-argument + - name: context-keys-type + - name: dot-imports + - name: error-return + - name: error-strings + - name: error-naming + - name: exported + - name: increment-decrement + - name: var-naming + - name: var-declaration + - name: package-comments + - name: range + - name: receiver-naming + - name: time-naming + - name: unexported-return + - name: indent-error-flow + - name: errorf + - name: empty-block + - name: superfluous-else + - name: unreachable-code + - name: redefines-builtin-id + # While we agree with this rule, right now it would break too many + # projects. So, we disable it by default. + - name: unused-parameter + disabled: true + gocyclo: + min-complexity: 25 + dupl: + threshold: 100 + goconst: + min-len: 3 + min-occurrences: 3 + lll: + line-length: 160 + gocritic: + enabled-tags: + - diagnostic + - experimental + - opinionated + - performance + - style + disabled-checks: + - whyNoLint + funlen: + lines: 500 + statements: 50 + govet: + enable: + - shadow + +linters: + disable-all: true + enable: + - bodyclose + - dogsled + - errcheck + - errorlint + - exhaustive + - exportloopref + - funlen + - goconst + - gocritic + - gocyclo + - gofmt + - goimports + - revive + - gosimple + - govet + - ineffassign + - lll + - nakedret + - staticcheck + - typecheck + - unparam + - unused + - whitespace + +issues: + exclude: + # We allow error shadowing + - 'declaration of "err" shadows declaration at' + + # Excluding configuration per-path, per-linter, per-text and per-source + exclude-rules: + # Exclude some linters from running on tests files. + - path: _test\.go + linters: + - gocyclo + - errcheck + - gosec + - funlen + - gocritic + - gochecknoglobals # Globals in test files are tolerated. + - goconst # Repeated consts in test files are tolerated. + # This rule is buggy and breaks on our `///Block` lines. Disable for now. + - linters: + - gocritic + text: "commentFormatting: put a space" + # This rule incorrectly flags nil references after assert.Assert(t, x != nil) + - path: _test\.go + text: "SA5011" + linters: + - staticcheck + - linters: + - lll + source: "^//go:generate " + - linters: + - lll + - gocritic + path: \.resolvers\.go + source: '^func \(r \*[a-zA-Z]+Resolvers\) ' + +output: + formats: + - format: colored-line-number + sort-results: true @@ -130,6 +130,9 @@ benchmark: 'gdu -npc ~' 'gdu -gnpc ~' 'gdu -npc --use-storage ~' sudo cpupower frequency-set -g schedutil +lint: + golangci-lint run -c .golangci.yml + clean: go mod tidy -rm coverage.txt @@ -151,5 +154,6 @@ install-dev-dependencies: go install gotest.tools/gotestsum@latest go install github.com/mitchellh/gox@latest go install honnef.co/go/gotraceui/cmd/gotraceui@master + go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest .PHONY: run build build-static build-all test gobench benchmark coverage coverage-html clean clean-uncompressed-dist man show-man release diff --git a/cmd/gdu/app/app_test.go b/cmd/gdu/app/app_test.go index e5a2765..61e0255 100644 --- a/cmd/gdu/app/app_test.go +++ b/cmd/gdu/app/app_test.go @@ -500,6 +500,7 @@ func TestMaxCoresLowEdge(t *testing.T) { assert.Nil(t, err) } +// nolint: unparam // Why: it's used in linux tests func runApp(flags *Flags, args []string, istty bool, getter device.DevicesInfoGetter) (string, error) { buff := bytes.NewBufferString("") diff --git a/internal/common/ignore.go b/internal/common/ignore.go index 366b059..66d2b4e 100644 --- a/internal/common/ignore.go +++ b/internal/common/ignore.go @@ -100,6 +100,7 @@ func (ui *UI) IsHiddenDir(name, path string) bool { } // CreateIgnoreFunc returns function for detecting if dir should be ignored +// nolint: gocyclo // Why: This function is a switch statement that is not too complex func (ui *UI) CreateIgnoreFunc() ShouldDirBeIgnored { switch { case len(ui.IgnoreDirPaths) > 0 && ui.IgnoreDirPathPatterns == nil && !ui.IgnoreHidden: diff --git a/internal/testanalyze/analyze.go b/internal/testanalyze/analyze.go index 3bb0532..22a8f9c 100644 --- a/internal/testanalyze/analyze.go +++ b/internal/testanalyze/analyze.go @@ -84,19 +84,19 @@ func (a *MockedAnalyzer) ResetProgress() {} // SetFollowSymlinks does nothing func (a *MockedAnalyzer) SetFollowSymlinks(v bool) {} -// RemoveItemFromDirWithErr returns error -func RemoveItemFromDirWithErr(dir fs.Item, file fs.Item) error { +// ItemFromDirWithErr returns error +func ItemFromDirWithErr(dir, file fs.Item) error { return errors.New("Failed") } -// RemoveItemFromDirWithSleep returns error -func RemoveItemFromDirWithSleep(dir fs.Item, file fs.Item) error { +// ItemFromDirWithSleep returns error +func ItemFromDirWithSleep(dir, file fs.Item) error { time.Sleep(time.Millisecond * 600) - return remove.RemoveItemFromDir(dir, file) + return remove.ItemFromDir(dir, file) } -// RemoveItemFromDirWithSleepAndErr returns error -func RemoveItemFromDirWithSleepAndErr(dir fs.Item, file fs.Item) error { +// ItemFromDirWithSleepAndErr returns error +func ItemFromDirWithSleepAndErr(dir, file fs.Item) error { time.Sleep(time.Millisecond * 600) return errors.New("Failed") } diff --git a/pkg/analyze/dir_linux-openbsd.go b/pkg/analyze/dir_linux-openbsd.go index c14a340..9f8346a 100644 --- a/pkg/analyze/dir_linux-openbsd.go +++ b/pkg/analyze/dir_linux-openbsd.go @@ -12,8 +12,7 @@ import ( const devBSize = 512 func setPlatformSpecificAttrs(file *File, f os.FileInfo) { - switch stat := f.Sys().(type) { - case *syscall.Stat_t: + if stat, ok := f.Sys().(*syscall.Stat_t); ok { file.Usage = stat.Blocks * devBSize file.Mtime = time.Unix(int64(stat.Mtim.Sec), int64(stat.Mtim.Nsec)) diff --git a/pkg/analyze/dir_unix.go b/pkg/analyze/dir_unix.go index 02bed93..88f5afa 100644 --- a/pkg/analyze/dir_unix.go +++ b/pkg/analyze/dir_unix.go @@ -12,8 +12,7 @@ import ( const devBSize = 512 func setPlatformSpecificAttrs(file *File, f os.FileInfo) { - switch stat := f.Sys().(type) { - case *syscall.Stat_t: + if stat, ok := f.Sys().(*syscall.Stat_t); ok { file.Usage = stat.Blocks * devBSize file.Mtime = time.Unix(int64(stat.Mtimespec.Sec), int64(stat.Mtimespec.Nsec)) diff --git a/pkg/analyze/file.go b/pkg/analyze/file.go index 8184ec7..87f749e 100644 --- a/pkg/analyze/file.go +++ b/pkg/analyze/file.go @@ -66,8 +66,7 @@ func (f *File) GetMtime() time.Time { // GetType returns name type of item func (f *File) GetType() string { - switch f.Flag { - case '@': + if f.Flag == '@' { return "Other" } return "File" @@ -97,7 +96,7 @@ func (f *File) alreadyCounted(linkedItems fs.HardLinkedItems) bool { } // GetItemStats returns 1 as count of items, apparent usage and real usage of this file -func (f *File) GetItemStats(linkedItems fs.HardLinkedItems) (int, int64, int64) { +func (f *File) GetItemStats(linkedItems fs.HardLinkedItems) (itemCount int, size, usage int64) { if f.alreadyCounted(linkedItems) { return 1, 0, 0 } @@ -198,7 +197,7 @@ func (f *Dir) GetPath() string { } // GetItemStats returns item count, apparent usage and real usage of this dir -func (f *Dir) GetItemStats(linkedItems fs.HardLinkedItems) (int, int64, int64) { +func (f *Dir) GetItemStats(linkedItems fs.HardLinkedItems) (itemCount int, size, usage int64) { f.UpdateStats(linkedItems) return f.ItemCount, f.GetSize(), f.GetUsage() } diff --git a/pkg/analyze/parallel.go b/pkg/analyze/parallel.go index eedce4d..7fa517a 100644 --- a/pkg/analyze/parallel.go +++ b/pkg/analyze/parallel.go @@ -140,12 +140,15 @@ func (a *ParallelAnalyzer) processDir(path string) *Dir { continue } if a.followSymlinks && info.Mode()&os.ModeSymlink != 0 { - err = followSymlink(entryPath, &info) + infoF, err := followSymlink(entryPath) if err != nil { log.Print(err.Error()) dir.Flag = '!' continue } + if infoF != nil { + info = infoF + } } file = &File{ @@ -211,27 +214,23 @@ func getDirFlag(err error, items int) rune { } func getFlag(f os.FileInfo) rune { - switch { - case f.Mode()&os.ModeSymlink != 0: - fallthrough - case f.Mode()&os.ModeSocket != 0: + if f.Mode()&os.ModeSymlink != 0 || f.Mode()&os.ModeSocket != 0 { return '@' - default: - return ' ' } + return ' ' } -func followSymlink(path string, f *os.FileInfo) error { +func followSymlink(path string) (os.FileInfo, error) { target, err := filepath.EvalSymlinks(path) if err != nil { - return err + return nil, err } tInfo, err := os.Lstat(target) if err != nil { - return err + return nil, err } if !tInfo.IsDir() { - *f = tInfo + return tInfo, nil } - return nil + return nil, nil } diff --git a/pkg/analyze/sequential.go b/pkg/analyze/sequential.go index 77fbd44..507ebfd 100644 --- a/pkg/analyze/sequential.go +++ b/pkg/analyze/sequential.go @@ -127,12 +127,15 @@ func (a *SequentialAnalyzer) processDir(path string) *Dir { continue } if a.followSymlinks && info.Mode()&os.ModeSymlink != 0 { - err = followSymlink(entryPath, &info) + infoF, err := followSymlink(entryPath) if err != nil { log.Print(err.Error()) dir.Flag = '!' continue } + if infoF != nil { + info = infoF + } } file = &File{ diff --git a/pkg/analyze/stored.go b/pkg/analyze/stored.go index 4e0ba10..2f9fde5 100644 --- a/pkg/analyze/stored.go +++ b/pkg/analyze/stored.go @@ -315,7 +315,7 @@ func (f *StoredDir) RemoveFile(item fs.Item) { } // GetItemStats returns item count, apparent usage and real usage of this dir -func (f *StoredDir) GetItemStats(linkedItems fs.HardLinkedItems) (int, int64, int64) { +func (f *StoredDir) GetItemStats(linkedItems fs.HardLinkedItems) (itemCount int, size, usage int64) { f.UpdateStats(linkedItems) return f.ItemCount, f.GetSize(), f.GetUsage() } @@ -385,9 +385,9 @@ func (p *ParentDir) GetFiles() fs.Files { panic("m func (p *ParentDir) GetFilesLocked() fs.Files { panic("must not be called") } func (p *ParentDir) RLock() func() { panic("must not be called") } func (p *ParentDir) SetFiles(fs.Files) { panic("must not be called") } -func (f *ParentDir) RemoveFile(item fs.Item) { panic("must not be called") } +func (p *ParentDir) RemoveFile(item fs.Item) { panic("must not be called") } func (p *ParentDir) GetItemStats( linkedItems fs.HardLinkedItems, -) (int, int64, int64) { +) (itemCount int, size, usage int64) { panic("must not be called") } diff --git a/pkg/analyze/wait.go b/pkg/analyze/wait.go index 204921a..f81b577 100644 --- a/pkg/analyze/wait.go +++ b/pkg/analyze/wait.go @@ -19,7 +19,7 @@ func (s *WaitGroup) Init() *WaitGroup { // Add increments value func (s *WaitGroup) Add(value int) { s.access.Lock() - s.value = s.value + value + s.value += value s.access.Unlock() } diff --git a/pkg/device/dev_freebsd_darwin_other.go b/pkg/device/dev_freebsd_darwin_other.go index 67c3e84..215462e 100644 --- a/pkg/device/dev_freebsd_darwin_other.go +++ b/pkg/device/dev_freebsd_darwin_other.go @@ -80,18 +80,20 @@ func processMounts(mounts Devices, ignoreErrors bool) (Devices, error) { devices := Devices{} for _, mount := range mounts { - if strings.HasPrefix(mount.Name, "/dev") || mount.Fstype == "zfs" { - info := &unix.Statfs_t{} - err := unix.Statfs(mount.MountPoint, info) - if err != nil && !ignoreErrors { - return nil, err - } - - mount.Size = int64(info.Bsize) * int64(info.Blocks) - mount.Free = int64(info.Bsize) * int64(info.Bavail) + if !strings.HasPrefix(mount.Name, "/dev") && mount.Fstype != "zfs" { + continue + } - devices = append(devices, mount) + info := &unix.Statfs_t{} + err := unix.Statfs(mount.MountPoint, info) + if err != nil && !ignoreErrors { + return nil, err } + + mount.Size = int64(info.Bsize) * int64(info.Blocks) + mount.Free = int64(info.Bsize) * int64(info.Bavail) + + devices = append(devices, mount) } return devices, nil diff --git a/pkg/device/dev_freebsd_darwin_test.go b/pkg/device/dev_freebsd_darwin_test.go index db286c2..2cf0077 100644 --- a/pkg/device/dev_freebsd_darwin_test.go +++ b/pkg/device/dev_freebsd_darwin_test.go @@ -34,7 +34,9 @@ argon:/usr/obj on /usr/obj (nfs)`)) } func TestMountsWithSpace(t *testing.T) { - mounts, err := readMountOutput(strings.NewReader(`//inglor@vault.lan/volatile on /Users/inglor/Mountpoints/volatile (vault.lan) (smbfs, nodev, nosuid, mounted by inglor)`)) + mounts, err := readMountOutput(strings.NewReader( + `//inglor@vault.lan/volatile on /Users/inglor/Mountpoints/volatile (vault.lan) (smbfs, nodev, nosuid, mounted by inglor)`, + )) assert.Equal(t, "//inglor@vault.lan/volatile", mounts[0].Name) assert.Equal(t, "/Users/inglor/Mountpoints/volatile (vault.lan)", mounts[0].MountPoint) assert.Equal(t, "smbfs", mounts[0].Fstype) diff --git a/pkg/device/dev_linux.go b/pkg/device/dev_linux.go index b6920d8..116b011 100644 --- a/pkg/device/dev_linux.go +++ b/pkg/device/dev_linux.go @@ -28,7 +28,7 @@ func (t LinuxDevicesInfoGetter) GetMounts() (Devices, error) { devices, err := readMountsFile(file) if err != nil { if cerr := file.Close(); cerr != nil { - return nil, fmt.Errorf("%w; %s", err, cerr) + return nil, fmt.Errorf("%w; %s", err, cerr.Error()) } return nil, err } diff --git a/pkg/device/dev_linux_test.go b/pkg/device/dev_linux_test.go index d43e39b..72e0908 100644 --- a/pkg/device/dev_linux_test.go +++ b/pkg/device/dev_linux_test.go @@ -48,6 +48,7 @@ rootpool/home /home zfs rw,nodev,relatime,xattr,posixacl 0 0 } func TestNfsMountsShown(t *testing.T) { + // nolint: lll // Why: Test data mounts, _ := readMountsFile(strings.NewReader(`host1:/dir1/ /mnt/dir1 nfs4 rw,nosuid,nodev,noatime,nodiratime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.1,fsc,local_lock=none,addr=192.168.1.2 0 0 host2:/dir2/ /mnt/dir2 nfs rw,relatime,vers=3,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.1.3,mountvers=3,mountport=38081,mountproto=udp,fsc,local_lock=none,addr=192.168.1.4 0 0`)) @@ -59,6 +60,7 @@ host2:/dir2/ /mnt/dir2 nfs rw,relatime,vers=3,rsize=524288,wsize=524288,namlen=2 } func TestMountsWithSpaces(t *testing.T) { + // nolint: lll // Why: Test data mounts, _ := readMountsFile(strings.NewReader(`host1:/dir1/ /mnt/dir\040with\040spaces nfs4 rw,nosuid,nodev,noatime,nodiratime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.1,fsc,local_lock=none,addr=192.168.1.2 0 0 host2:/dir2/ /mnt/dir2 nfs rw,relatime,vers=3,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.1.3,mountvers=3,mountport=38081,mountproto=udp,fsc,local_lock=none,addr=192.168.1.4 0 0`)) diff --git a/pkg/fs/file.go b/pkg/fs/file.go index 7d286b0..9b83aa2 100644 --- a/pkg/fs/file.go +++ b/pkg/fs/file.go @@ -22,7 +22,7 @@ type Item interface { SetParent(Item) GetMultiLinkedInode() uint64 EncodeJSON(writer io.Writer, topLevel bool) error - GetItemStats(linkedItems HardLinkedItems) (int, int64, int64) + GetItemStats(linkedItems HardLinkedItems) (itemCount int, size, usage int64) UpdateStats(linkedItems HardLinkedItems) AddFile(Item) GetFiles() Files diff --git a/pkg/remove/parallel.go b/pkg/remove/parallel.go index d5dd11e..606db20 100644 --- a/pkg/remove/parallel.go +++ b/pkg/remove/parallel.go @@ -10,10 +10,10 @@ import ( var concurrencyLimit = make(chan struct{}, 3*runtime.GOMAXPROCS(0)) -// RemoveItemFromDirParallel removes item from dir -func RemoveItemFromDirParallel(dir fs.Item, item fs.Item) error { +// ItemFromDirParallel removes item from dir +func ItemFromDirParallel(dir, item fs.Item) error { if !item.IsDir() { - return RemoveItemFromDir(dir, item) + return ItemFromDir(dir, item) } errChan := make(chan error, 1) // we show only first error var wait sync.WaitGroup diff --git a/pkg/remove/parallel_linux_test.go b/pkg/remove/parallel_linux_test.go index fca34ef..f628842 100644 --- a/pkg/remove/parallel_linux_test.go +++ b/pkg/remove/parallel_linux_test.go @@ -13,7 +13,7 @@ import ( "github.com/stretchr/testify/assert" ) -func TestRemoveItemFromDirParallelWithErr(t *testing.T) { +func TestItemFromDirParallelWithErr(t *testing.T) { fin := testdir.CreateTestDir() defer fin() @@ -38,11 +38,11 @@ func TestRemoveItemFromDirParallelWithErr(t *testing.T) { }, } - err = RemoveItemFromDirParallel(dir, subdir) + err = ItemFromDirParallel(dir, subdir) assert.Contains(t, err.Error(), "permission denied") } -func TestRemoveItemFromDirParallelWithErr2(t *testing.T) { +func TestItemFromDirParallelWithErr2(t *testing.T) { fin := testdir.CreateTestDir() defer fin() @@ -62,6 +62,6 @@ func TestRemoveItemFromDirParallelWithErr2(t *testing.T) { subdir := dir.Files[0].(*analyze.Dir) - err = RemoveItemFromDirParallel(dir, subdir) + err = ItemFromDirParallel(dir, subdir) assert.Contains(t, err.Error(), "permission denied") } diff --git a/pkg/remove/parallel_test.go b/pkg/remove/parallel_test.go index 6196d78..f53ef5c 100644 --- a/pkg/remove/parallel_test.go +++ b/pkg/remove/parallel_test.go @@ -39,7 +39,7 @@ func TestRemoveFileParallel(t *testing.T) { dir.Files = fs.Files{subdir} subdir.Files = fs.Files{file} - err := RemoveItemFromDirParallel(subdir, file) + err := ItemFromDirParallel(subdir, file) assert.Nil(t, err) assert.Equal(t, 0, len(subdir.Files)) @@ -64,6 +64,6 @@ func TestRemoveDirParallel(t *testing.T) { subdir := dir.Files[0].(*analyze.Dir) - err := RemoveItemFromDirParallel(dir, subdir) + err := ItemFromDirParallel(dir, subdir) assert.Nil(t, err) } diff --git a/pkg/remove/remove.go b/pkg/remove/remove.go index 1d17985..a385eeb 100644 --- a/pkg/remove/remove.go +++ b/pkg/remove/remove.go @@ -7,8 +7,8 @@ import ( "github.com/dundee/gdu/v5/pkg/fs" ) -// RemoveItemFromDir removes item from dir -func RemoveItemFromDir(dir fs.Item, item fs.Item) error { +// ItemFromDir removes item from dir +func ItemFromDir(dir, item fs.Item) error { err := os.RemoveAll(item.GetPath()) if err != nil { return err @@ -19,7 +19,7 @@ func RemoveItemFromDir(dir fs.Item, item fs.Item) error { } // EmptyFileFromDir empty file from dir -func EmptyFileFromDir(dir fs.Item, file fs.Item) error { +func EmptyFileFromDir(dir, file fs.Item) error { err := os.Truncate(file.GetPath(), 0) if err != nil { return err diff --git a/pkg/remove/remove_linux_test.go b/pkg/remove/remove_linux_test.go index 19fc503..2739ba9 100644 --- a/pkg/remove/remove_linux_test.go +++ b/pkg/remove/remove_linux_test.go @@ -37,6 +37,6 @@ func TestRemoveFileWithErr(t *testing.T) { }, } - err = RemoveItemFromDir(dir, subdir) + err = ItemFromDir(dir, subdir) assert.Contains(t, err.Error(), "permission denied") } diff --git a/pkg/remove/remove_test.go b/pkg/remove/remove_test.go index 11a1c23..a2ed697 100644 --- a/pkg/remove/remove_test.go +++ b/pkg/remove/remove_test.go @@ -83,7 +83,7 @@ func TestRemoveFile(t *testing.T) { dir.Files = fs.Files{subdir} subdir.Files = fs.Files{file} - err := RemoveItemFromDir(subdir, file) + err := ItemFromDir(subdir, file) assert.Nil(t, err) assert.Equal(t, 0, len(subdir.Files)) diff --git a/report/export.go b/report/export.go index e011933..c0c4964 100644 --- a/report/export.go +++ b/report/export.go @@ -140,7 +140,7 @@ func (ui *UI) exportDir(dir fs.Item, waitWritten *sync.WaitGroup) error { buff.Write([]byte(strconv.FormatInt(time.Now().Unix(), 10))) buff.Write([]byte("},\n")) - if err = dir.EncodeJSON(&buff, true); err != nil { + if err := dir.EncodeJSON(&buff, true); err != nil { return err } if _, err = buff.Write([]byte("]\n")); err != nil { @@ -150,8 +150,7 @@ func (ui *UI) exportDir(dir fs.Item, waitWritten *sync.WaitGroup) error { return err } - switch f := ui.exportOutput.(type) { - case *os.File: + if f, ok := ui.exportOutput.(*os.File); ok { err = f.Close() if err != nil { return err diff --git a/stdout/stdout.go b/stdout/stdout.go index 5b1ecba..669fc69 100644 --- a/stdout/stdout.go +++ b/stdout/stdout.go @@ -440,7 +440,7 @@ func maxLength(list []*device.Device, keyGetter func(*device.Device) string) int return maxLen } -func maxInt(x int, y int) int { +func maxInt(x, y int) int { if x > y { return x } diff --git a/tui/actions.go b/tui/actions.go index d09216b..04e931b 100644 --- a/tui/actions.go +++ b/tui/actions.go @@ -25,6 +25,12 @@ import ( const ( defaultLinesCount = 500 linesTreshold = 20 + + actionEmpty = "empty" + actionDelete = "delete" + + actingEmpty = "emptying" + actingDelete = "deleting" ) // ListDevices lists mounted devices and shows their disk usage @@ -178,11 +184,11 @@ func (ui *UI) deleteSelected(shouldEmpty bool) { var action, acting string if shouldEmpty { - action = "empty " - acting = "emptying" + action = actionEmpty + acting = actingEmpty } else { - action = "delete " - acting = "deleting" + action = actionDelete + acting = actingDelete } modal := tview.NewModal().SetText( // nolint: staticcheck // Why: fixed string @@ -214,7 +220,7 @@ func (ui *UI) deleteSelected(shouldEmpty bool) { go func() { for _, item := range deleteItems { if err := deleteFun(currentDir, item); err != nil { - msg := "Can't " + action + tview.Escape(selectedItem.GetName()) + msg := "Can't " + action + " " + tview.Escape(selectedItem.GetName()) ui.app.QueueUpdateDraw(func() { ui.pages.RemovePage(acting) ui.showErr(msg, err) diff --git a/tui/background.go b/tui/background.go index f373f23..8974def 100644 --- a/tui/background.go +++ b/tui/background.go @@ -35,9 +35,9 @@ func (ui *UI) deleteItem(item fs.Item, shouldEmpty bool) { var action, acting string if shouldEmpty { - action = "empty " + action = actionEmpty } else { - action = "delete " + action = actionDelete } var deleteFun func(fs.Item, fs.Item) error @@ -61,7 +61,7 @@ func (ui *UI) deleteItem(item fs.Item, shouldEmpty bool) { for _, toDelete := range deleteItems { if err := deleteFun(parentDir, toDelete); err != nil { - msg := "Can't " + action + tview.Escape(toDelete.GetName()) + msg := "Can't " + action + " " + tview.Escape(toDelete.GetName()) ui.app.QueueUpdateDraw(func() { ui.pages.RemovePage(acting) ui.showErr(msg, err) diff --git a/tui/exec.go b/tui/exec.go index 7e5af29..24c3e11 100644 --- a/tui/exec.go +++ b/tui/exec.go @@ -6,7 +6,7 @@ import ( ) // Execute runs given bin path via exec.Command call -func Execute(argv0 string, argv []string, envv []string) error { +func Execute(argv0 string, argv, envv []string) error { cmd := exec.Command(argv0, argv...) cmd.Stdout = os.Stdout |