diff options
author | Daniel Milde <daniel@milde.cz> | 2024-04-14 21:12:41 +0200 |
---|---|---|
committer | Daniel Milde <daniel@milde.cz> | 2024-04-14 23:03:01 +0200 |
commit | bb8e684a8305929b90b3f79f4cf0dfac5dfc74f9 (patch) | |
tree | 9b52ed9db7e9b5c381ff529bd9837ddfb2d022e4 | |
parent | ec0e2bb22622b9a2b081c3e908c829fe00c87a13 (diff) |
refactor: move removal logic to separate package
-rw-r--r-- | internal/testanalyze/analyze.go | 3 | ||||
-rw-r--r-- | pkg/analyze/file.go | 42 | ||||
-rw-r--r-- | pkg/analyze/file_test.go | 120 | ||||
-rw-r--r-- | pkg/remove/remove.go | 49 | ||||
-rw-r--r-- | pkg/remove/remove_linux_test.go (renamed from pkg/analyze/file_linux_test.go) | 11 | ||||
-rw-r--r-- | pkg/remove/remove_test.go | 130 | ||||
-rw-r--r-- | tui/tui.go | 5 |
7 files changed, 190 insertions, 170 deletions
diff --git a/internal/testanalyze/analyze.go b/internal/testanalyze/analyze.go index 9911a98..3bb0532 100644 --- a/internal/testanalyze/analyze.go +++ b/internal/testanalyze/analyze.go @@ -7,6 +7,7 @@ import ( "github.com/dundee/gdu/v5/internal/common" "github.com/dundee/gdu/v5/pkg/analyze" "github.com/dundee/gdu/v5/pkg/fs" + "github.com/dundee/gdu/v5/pkg/remove" ) // MockedAnalyzer returns dir with files with different size exponents @@ -91,7 +92,7 @@ func RemoveItemFromDirWithErr(dir fs.Item, file fs.Item) error { // RemoveItemFromDirWithSleep returns error func RemoveItemFromDirWithSleep(dir fs.Item, file fs.Item) error { time.Sleep(time.Millisecond * 600) - return analyze.RemoveItemFromDir(dir, file) + return remove.RemoveItemFromDir(dir, file) } // RemoveItemFromDirWithSleepAndErr returns error diff --git a/pkg/analyze/file.go b/pkg/analyze/file.go index 401a822..a933d8f 100644 --- a/pkg/analyze/file.go +++ b/pkg/analyze/file.go @@ -1,7 +1,6 @@ package analyze import ( - "os" "path/filepath" "sync" "time" @@ -256,44 +255,3 @@ func (f *Dir) RLock() func() { f.m.RLock() return f.m.RUnlock } - -// RemoveItemFromDir removes item from dir -func RemoveItemFromDir(dir fs.Item, item fs.Item) error { - err := os.RemoveAll(item.GetPath()) - if err != nil { - return err - } - - dir.RemoveFile(item) - return nil -} - -// EmptyFileFromDir empty file from dir -func EmptyFileFromDir(dir fs.Item, file fs.Item) error { - err := os.Truncate(file.GetPath(), 0) - if err != nil { - return err - } - - cur := dir.(*Dir) - for { - cur.Size -= file.GetSize() - cur.Usage -= file.GetUsage() - - if cur.Parent == nil { - break - } - cur = cur.Parent.(*Dir) - } - - dir.SetFiles(dir.GetFiles().Remove(file)) - newFile := &File{ - Name: file.GetName(), - Flag: file.GetFlag(), - Size: 0, - Parent: dir, - } - dir.AddFile(newFile) - - return nil -} diff --git a/pkg/analyze/file_test.go b/pkg/analyze/file_test.go index e5652c4..0255893 100644 --- a/pkg/analyze/file_test.go +++ b/pkg/analyze/file_test.go @@ -4,7 +4,6 @@ import ( "testing" "time" - "github.com/dundee/gdu/v5/internal/testdir" "github.com/dundee/gdu/v5/pkg/fs" "github.com/stretchr/testify/assert" ) @@ -201,125 +200,6 @@ func TestRemoveByNameNotInDir(t *testing.T) { assert.Equal(t, 1, len(dir.Files)) } -func TestRemoveFile(t *testing.T) { - dir := &Dir{ - File: &File{ - Name: "xxx", - Size: 5, - Usage: 12, - }, - ItemCount: 3, - BasePath: ".", - } - - subdir := &Dir{ - File: &File{ - Name: "yyy", - Size: 4, - Usage: 8, - Parent: dir, - }, - ItemCount: 2, - } - file := &File{ - Name: "zzz", - Size: 3, - Usage: 4, - Parent: subdir, - } - dir.Files = fs.Files{subdir} - subdir.Files = fs.Files{file} - - err := RemoveItemFromDir(subdir, file) - assert.Nil(t, err) - - assert.Equal(t, 0, len(subdir.Files)) - assert.Equal(t, 1, subdir.ItemCount) - assert.Equal(t, int64(1), subdir.Size) - assert.Equal(t, int64(4), subdir.Usage) - assert.Equal(t, 1, len(dir.Files)) - assert.Equal(t, 2, dir.ItemCount) - assert.Equal(t, int64(2), dir.Size) -} - -func TestTruncateFile(t *testing.T) { - fin := testdir.CreateTestDir() - defer fin() - - dir := &Dir{ - File: &File{ - Name: "test_dir", - Size: 5, - Usage: 12, - }, - ItemCount: 3, - BasePath: ".", - } - - subdir := &Dir{ - File: &File{ - Name: "nested", - Size: 4, - Usage: 8, - Parent: dir, - }, - ItemCount: 2, - } - file := &File{ - Name: "file2", - Size: 3, - Usage: 4, - Parent: subdir, - } - dir.Files = fs.Files{subdir} - subdir.Files = fs.Files{file} - - err := EmptyFileFromDir(subdir, file) - - assert.Nil(t, err) - assert.Equal(t, 1, len(subdir.Files)) - assert.Equal(t, 2, subdir.ItemCount) - assert.Equal(t, int64(1), subdir.Size) - assert.Equal(t, int64(4), subdir.Usage) - assert.Equal(t, 1, len(dir.Files)) - assert.Equal(t, 3, dir.ItemCount) - assert.Equal(t, int64(2), dir.Size) -} - -func TestTruncateFileWithErr(t *testing.T) { - dir := &Dir{ - File: &File{ - Name: "xxx", - Size: 5, - Usage: 12, - }, - ItemCount: 3, - BasePath: ".", - } - - subdir := &Dir{ - File: &File{ - Name: "yyy", - Size: 4, - Usage: 8, - Parent: dir, - }, - ItemCount: 2, - } - file := &File{ - Name: "zzz", - Size: 3, - Usage: 4, - Parent: subdir, - } - dir.Files = fs.Files{subdir} - subdir.Files = fs.Files{file} - - err := EmptyFileFromDir(subdir, file) - - assert.Contains(t, err.Error(), "no such file or directory") -} - func TestUpdateStats(t *testing.T) { dir := Dir{ File: &File{ diff --git a/pkg/remove/remove.go b/pkg/remove/remove.go new file mode 100644 index 0000000..1d17985 --- /dev/null +++ b/pkg/remove/remove.go @@ -0,0 +1,49 @@ +package remove + +import ( + "os" + + "github.com/dundee/gdu/v5/pkg/analyze" + "github.com/dundee/gdu/v5/pkg/fs" +) + +// RemoveItemFromDir removes item from dir +func RemoveItemFromDir(dir fs.Item, item fs.Item) error { + err := os.RemoveAll(item.GetPath()) + if err != nil { + return err + } + + dir.RemoveFile(item) + return nil +} + +// EmptyFileFromDir empty file from dir +func EmptyFileFromDir(dir fs.Item, file fs.Item) error { + err := os.Truncate(file.GetPath(), 0) + if err != nil { + return err + } + + cur := dir.(*analyze.Dir) + for { + cur.Size -= file.GetSize() + cur.Usage -= file.GetUsage() + + if cur.Parent == nil { + break + } + cur = cur.Parent.(*analyze.Dir) + } + + dir.SetFiles(dir.GetFiles().Remove(file)) + newFile := &analyze.File{ + Name: file.GetName(), + Flag: file.GetFlag(), + Size: 0, + Parent: dir, + } + dir.AddFile(newFile) + + return nil +} diff --git a/pkg/analyze/file_linux_test.go b/pkg/remove/remove_linux_test.go index 049c0b1..c09d85d 100644 --- a/pkg/analyze/file_linux_test.go +++ b/pkg/remove/remove_linux_test.go @@ -1,13 +1,14 @@ //go:build linux // +build linux -package analyze +package remove import ( "os" "testing" "github.com/dundee/gdu/v5/internal/testdir" + "github.com/dundee/gdu/v5/pkg/analyze" "github.com/stretchr/testify/assert" ) @@ -22,15 +23,15 @@ func TestRemoveFileWithErr(t *testing.T) { assert.Nil(t, err) }() - dir := &Dir{ - File: &File{ + dir := &analyze.Dir{ + File: &analyze.File{ Name: "test_dir", }, BasePath: ".", } - subdir := &Dir{ - File: &File{ + subdir := &analyze.Dir{ + File: &analyze.File{ Name: "nested", Parent: dir, }, diff --git a/pkg/remove/remove_test.go b/pkg/remove/remove_test.go new file mode 100644 index 0000000..11a1c23 --- /dev/null +++ b/pkg/remove/remove_test.go @@ -0,0 +1,130 @@ +package remove + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/dundee/gdu/v5/internal/testdir" + "github.com/dundee/gdu/v5/pkg/analyze" + "github.com/dundee/gdu/v5/pkg/fs" +) + +func TestTruncateFile(t *testing.T) { + fin := testdir.CreateTestDir() + defer fin() + + dir := &analyze.Dir{ + File: &analyze.File{ + Name: "test_dir", + Size: 5, + Usage: 12, + }, + ItemCount: 3, + BasePath: ".", + } + + subdir := &analyze.Dir{ + File: &analyze.File{ + Name: "nested", + Size: 4, + Usage: 8, + Parent: dir, + }, + ItemCount: 2, + } + file := &analyze.File{ + Name: "file2", + Size: 3, + Usage: 4, + Parent: subdir, + } + dir.Files = fs.Files{subdir} + subdir.Files = fs.Files{file} + + err := EmptyFileFromDir(subdir, file) + + assert.Nil(t, err) + assert.Equal(t, 1, len(subdir.Files)) + assert.Equal(t, 2, subdir.ItemCount) + assert.Equal(t, int64(1), subdir.Size) + assert.Equal(t, int64(4), subdir.Usage) + assert.Equal(t, 1, len(dir.Files)) + assert.Equal(t, 3, dir.ItemCount) + assert.Equal(t, int64(2), dir.Size) +} + +func TestRemoveFile(t *testing.T) { + dir := &analyze.Dir{ + File: &analyze.File{ + Name: "xxx", + Size: 5, + Usage: 12, + }, + ItemCount: 3, + BasePath: ".", + } + + subdir := &analyze.Dir{ + File: &analyze.File{ + Name: "yyy", + Size: 4, + Usage: 8, + Parent: dir, + }, + ItemCount: 2, + } + file := &analyze.File{ + Name: "zzz", + Size: 3, + Usage: 4, + Parent: subdir, + } + dir.Files = fs.Files{subdir} + subdir.Files = fs.Files{file} + + err := RemoveItemFromDir(subdir, file) + assert.Nil(t, err) + + assert.Equal(t, 0, len(subdir.Files)) + assert.Equal(t, 1, subdir.ItemCount) + assert.Equal(t, int64(1), subdir.Size) + assert.Equal(t, int64(4), subdir.Usage) + assert.Equal(t, 1, len(dir.Files)) + assert.Equal(t, 2, dir.ItemCount) + assert.Equal(t, int64(2), dir.Size) +} + +func TestTruncateFileWithErr(t *testing.T) { + dir := &analyze.Dir{ + File: &analyze.File{ + Name: "xxx", + Size: 5, + Usage: 12, + }, + ItemCount: 3, + BasePath: ".", + } + + subdir := &analyze.Dir{ + File: &analyze.File{ + Name: "yyy", + Size: 4, + Usage: 8, + Parent: dir, + }, + ItemCount: 2, + } + file := &analyze.File{ + Name: "zzz", + Size: 3, + Usage: 4, + Parent: subdir, + } + dir.Files = fs.Files{subdir} + subdir.Files = fs.Files{file} + + err := EmptyFileFromDir(subdir, file) + + assert.Contains(t, err.Error(), "no such file or directory") +} @@ -14,6 +14,7 @@ import ( "github.com/dundee/gdu/v5/pkg/analyze" "github.com/dundee/gdu/v5/pkg/device" "github.com/dundee/gdu/v5/pkg/fs" + "github.com/dundee/gdu/v5/pkg/remove" "github.com/gdamore/tcell/v2" "github.com/rivo/tview" ) @@ -105,8 +106,8 @@ func CreateUI( output: output, askBeforeDelete: true, showItemCount: false, - remover: analyze.RemoveItemFromDir, - emptier: analyze.EmptyFileFromDir, + remover: remove.RemoveItemFromDir, + emptier: remove.EmptyFileFromDir, exec: Execute, linkedItems: make(fs.HardLinkedItems, 10), selectedTextColor: tview.Styles.TitleColor, |