/
zip.go
98 lines (78 loc) · 2.01 KB
/
zip.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package activities
import (
"archive/zip"
"context"
"fmt"
"io"
"os"
"path/filepath"
"github.com/go-logr/logr"
)
const ZipActivityName = "ZipActivity"
type ZipActivityParams struct {
SourceDir string
DestPath string
}
type ZipActivityResult struct {
Path string
}
type zipActivity struct {
logger logr.Logger
}
func NewZipActivity(logger logr.Logger) *zipActivity {
return &zipActivity{logger: logger}
}
// Execute creates a Zip archive at params.DestPath from the contents of
// params.SourceDir. If params.DestPath is not specified then params.SourceDir
// + ".zip" will be used.
func (a *zipActivity) Execute(ctx context.Context, params *ZipActivityParams) (*ZipActivityResult, error) {
a.logger.V(1).Info("Executing ZipActivity",
"SourceDir", params.SourceDir,
"DestPath", params.DestPath,
)
if params.SourceDir == "" {
return &ZipActivityResult{}, fmt.Errorf("%s: missing source dir", ZipActivityName)
}
dest := params.DestPath
if params.DestPath == "" {
dest = params.SourceDir + ".zip"
a.logger.V(1).Info(ZipActivityName+": dest changed", "dest", dest)
}
w, err := os.Create(dest) // #nosec G304 -- trusted path
if err != nil {
return &ZipActivityResult{}, fmt.Errorf("%s: create: %v", ZipActivityName, err)
}
defer w.Close()
z := zip.NewWriter(w)
defer z.Close()
err = filepath.WalkDir(params.SourceDir, func(path string, d os.DirEntry, err error) error {
if err != nil {
return err
}
if d.IsDir() {
return nil
}
// Include SourceDir in the zip paths, but not its parent dirs.
p, err := filepath.Rel(filepath.Dir(params.SourceDir), path)
if err != nil {
return err
}
f, err := z.Create(p)
if err != nil {
return err
}
r, err := os.Open(path) // #nosec G304 -- trusted path
if err != nil {
return err
}
defer r.Close()
if _, err := io.Copy(f, r); err != nil {
return err
}
return nil
})
if err != nil {
return &ZipActivityResult{}, fmt.Errorf("%s: add files: %v", ZipActivityName, err)
}
return &ZipActivityResult{Path: dest}, nil
}