@@ -2,67 +2,128 @@ package internal
22
33import (
44 "archive/zip"
5+ "fmt"
56 "io"
7+ "log/slog"
68 "os"
79 "path/filepath"
810 "strings"
11+
12+ "github.com/charmbracelet/bubbles/progress"
13+ "github.com/lithammer/shortuuid"
14+ "github.com/yorukot/superfile/src/config/icon"
15+ "github.com/yorukot/superfile/src/internal/common"
916)
1017
1118func zipSources (sources []string , target string ) error {
19+ id := shortuuid .New ()
20+ prog := progress .New ()
21+ prog .PercentageStyle = common .FooterStyle
22+ var err error = nil
23+
24+ for _ , src := range sources {
25+ if _ , err := os .Stat (src ); os .IsNotExist (err ) {
26+ return fmt .Errorf ("source path does not exist: %s" , src )
27+ }
28+ }
29+
30+ totalFiles := 0
31+ for _ , src := range sources {
32+ count , err := countFiles (src )
33+ if err != nil {
34+ slog .Error ("Error while zip file count files " , "error" , err )
35+ }
36+ totalFiles += count
37+ }
38+ p := process {
39+ name : "zip files" ,
40+ progress : prog ,
41+ state : inOperation ,
42+ total : totalFiles ,
43+ done : 0 ,
44+ }
45+ message := channelMessage {
46+ messageID : id ,
47+ messageType : sendProcess ,
48+ processNewState : p ,
49+ }
50+
51+ _ , err = os .Stat (target )
52+ if err == nil {
53+ p .name = icon .CompressFile + icon .Space + "File already exist"
54+ message .processNewState = p
55+ channel <- message
56+ return nil
57+ }
58+
1259 f , err := os .Create (target )
1360 if err != nil {
1461 return err
1562 }
16-
1763 defer f .Close ()
1864 writer := zip .NewWriter (f )
1965 defer writer .Close ()
2066
2167 for _ , src := range sources {
2268 srcParentDir := filepath .Dir (src )
2369 err = filepath .Walk (src , func (path string , info os.FileInfo , err error ) error {
70+ p .name = icon .CompressFile + icon .Space + filepath .Base (path )
71+ if len (channel ) < 5 {
72+ message .processNewState = p
73+ channel <- message
74+ }
2475 if err != nil {
2576 return err
2677 }
27-
2878 relPath , err := filepath .Rel (srcParentDir , path )
2979 if err != nil {
3080 return err
3181 }
32-
3382 header , err := zip .FileInfoHeader (info )
3483 if err != nil {
3584 return err
3685 }
37-
3886 header .Method = zip .Deflate
3987 header .Name = relPath
4088 if info .IsDir () {
4189 header .Name += "/"
4290 }
43-
44- hw , err := writer .CreateHeader (header )
91+ headerWriter , err := writer .CreateHeader (header )
4592 if err != nil {
4693 return err
4794 }
48-
4995 if info .IsDir () {
5096 return nil
5197 }
52-
5398 file , err := os .Open (path )
5499 if err != nil {
55100 return err
56101 }
57-
58102 defer file .Close ()
59- _ , err = io .Copy (hw , file )
60- return err
103+ _ , err = io .Copy (headerWriter , file )
104+ if err != nil {
105+ return err
106+ }
107+ p .done ++
108+ if len (channel ) < 5 {
109+ message .processNewState = p
110+ channel <- message
111+ }
112+ return nil
61113 })
62114 if err != nil {
115+ slog .Error ("Error while zip file" , "error" , err )
116+ p .state = failure
117+ message .processNewState = p
118+ channel <- message
63119 return err
64120 }
65121 }
122+
123+ p .state = successful
124+ p .done = totalFiles
125+ message .processNewState = p
126+ channel <- message
66127 return nil
67128}
68129
0 commit comments