github.com/joselitofilho/goreleaser@v0.155.1-0.20210123221854-e4891856c593/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 "compress/flate" 8 "io" 9 "os" 10 ) 11 12 // Archive zip struct. 13 type Archive struct { 14 z *zip.Writer 15 } 16 17 // Close all closeables. 18 func (a Archive) Close() error { 19 return a.z.Close() 20 } 21 22 // New zip archive. 23 func New(target io.Writer) Archive { 24 compressor := zip.NewWriter(target) 25 compressor.RegisterCompressor(zip.Deflate, func(out io.Writer) (io.WriteCloser, error) { 26 return flate.NewWriter(out, flate.BestCompression) 27 }) 28 return Archive{ 29 z: compressor, 30 } 31 } 32 33 // Add a file to the zip archive. 34 func (a Archive) Add(name, path string) (err error) { 35 file, err := os.Open(path) // #nosec 36 if err != nil { 37 return 38 } 39 defer file.Close() 40 info, err := file.Stat() 41 if err != nil { 42 return 43 } 44 if info.IsDir() { 45 return 46 } 47 header, err := zip.FileInfoHeader(info) 48 if err != nil { 49 return err 50 } 51 header.Name = name 52 header.Method = zip.Deflate 53 w, err := a.z.CreateHeader(header) 54 if err != nil { 55 return err 56 } 57 _, err = io.Copy(w, file) 58 return err 59 }