Skip to content

Commit a4f58bd

Browse files
committed
Added process-management to zipSources Func
1 parent 4e9baaf commit a4f58bd

File tree

1 file changed

+72
-11
lines changed

1 file changed

+72
-11
lines changed

src/internal/file_operations_compress.go

Lines changed: 72 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,67 +2,128 @@ package internal
22

33
import (
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

1118
func 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

Comments
 (0)