@@ -9,15 +9,16 @@ import (
9
9
"regexp"
10
10
"strings"
11
11
"sync"
12
+
13
+ tea "github.com/charmbracelet/bubbletea"
12
14
)
13
15
14
16
func main () {
15
17
var ignoreNamesFlag , ignoreRegexFlag string
16
18
var workers uint
17
- var deleteFlag bool
18
19
flag .StringVar (& ignoreNamesFlag , "ignore-names" , "" , "Comma-separated list of file/folder names to ignore (exact match)" )
19
20
flag .StringVar (& ignoreRegexFlag , "ignore-regex" , "" , "Regex pattern to ignore files by path" )
20
- flag .BoolVar (& deleteFlag , "delete " , false , "Enable interactive deletion of duplicates " )
21
+ flag .BoolVar (& interactiveMode , "it " , false , "Interactive TUI mode " )
21
22
flag .UintVar (& workers , "workers" , 4 , "Number of concurrent workers" )
22
23
flag .Parse ()
23
24
@@ -55,53 +56,53 @@ func main() {
55
56
sem := make (chan struct {}, workers )
56
57
results := make (chan []string )
57
58
58
- var wg sync.WaitGroup
59
- for _ , v := range m {
60
- if len (v ) < 2 {
61
- continue
62
- }
63
- wg .Add (1 )
64
- go func (files sameSizeFiles ) {
65
- defer wg .Done ()
66
- sem <- struct {}{}
67
- defer func () { <- sem }()
68
-
69
- res , err := groupByHash (files , workers )
70
- if err != nil {
71
- log .Printf ("Skipping due to error: %v" , err )
72
- return
59
+ go func () {
60
+ var wg sync.WaitGroup
61
+ for _ , v := range m {
62
+ if len (v ) < 2 {
63
+ continue
73
64
}
65
+ wg .Add (1 )
66
+ go func (files sameSizeFiles ) {
67
+ defer wg .Done ()
68
+ sem <- struct {}{}
69
+ defer func () { <- sem }()
74
70
75
- for _ , v := range res {
76
- groups , err := partitionIntoEqualGroups (v )
71
+ res , err := groupByHash (files , workers )
77
72
if err != nil {
78
- log .Printf ("Error partitioning : %v" , err )
73
+ log .Printf ("Error: %v" , err )
79
74
return
80
75
}
81
- for _ , group := range groups {
82
- if len (group ) >= 2 {
83
- results <- group
76
+
77
+ for _ , v := range res {
78
+ groups , err := partitionIntoEqualGroups (v )
79
+ if err != nil {
80
+ log .Printf ("Error: %v" , err )
81
+ continue
82
+ }
83
+ for _ , group := range groups {
84
+ if len (group ) >= 2 {
85
+ results <- group
86
+ }
84
87
}
85
88
}
86
- }
87
- }(v )
88
- }
89
+ }(v )
90
+ }
89
91
90
- go func () {
91
- wg .Wait ()
92
- close (results )
92
+ go func () {
93
+ wg .Wait ()
94
+ close (results )
95
+ }()
93
96
}()
94
97
95
- var allGroups [][]string
96
- for group := range results {
97
- if deleteFlag {
98
- allGroups = append (allGroups , group )
99
- } else {
98
+ if interactiveMode {
99
+ p := tea .NewProgram (initialModel (results ))
100
+ if _ , err := p .Run (); err != nil {
101
+ log .Fatal (err )
102
+ }
103
+ } else {
104
+ for group := range results {
100
105
fmt .Println ("Equal files:" , group )
101
106
}
102
107
}
103
-
104
- if deleteFlag {
105
- handleDeletions (allGroups )
106
- }
107
108
}
0 commit comments