github.com/axxelG/goreleaser@v0.92.0/pkg/archive/zip/zip.go (about) 1 // Package zip implements the Archive interface providing zip archiving 2 // and compression. 3 package zip 4 5 import ( 6 "archive/zip" 7 "io" 8 "os" 9 ) 10 11 // Archive zip struct 12 type Archive struct { 13 z *zip.Writer 14 } 15 16 // Close all closeables 17 func (a Archive) Close() error { 18 return a.z.Close() 19 } 20 21 // New zip archive 22 func New(target io.Writer) Archive { 23 return Archive{ 24 z: zip.NewWriter(target), 25 } 26 } 27 28 // Add a file to the zip archive 29 func (a Archive) Add(name, path string) (err error) { 30 file, err := os.Open(path) // #nosec 31 if err != nil { 32 return 33 } 34 defer file.Close() // nolint: errcheck 35 info, err := file.Stat() 36 if err != nil { 37 return 38 } 39 if info.IsDir() { 40 return 41 } 42 header, err := zip.FileInfoHeader(info) 43 if err != nil { 44 return err 45 } 46 header.Name = name 47 header.Method = zip.Deflate 48 w, err := a.z.CreateHeader(header) 49 if err != nil { 50 return err 51 } 52 _, err = io.Copy(w, file) 53 return err 54 }