github.com/joselitofilho/goreleaser@v0.155.1-0.20210123221854-e4891856c593/pkg/archive/targz/targz.go (about) 1 // Package targz implements the Archive interface providing tar.gz archiving 2 // and compression. 3 package targz 4 5 import ( 6 "archive/tar" 7 "compress/gzip" 8 "io" 9 "os" 10 ) 11 12 // Archive as tar.gz. 13 type Archive struct { 14 gw *gzip.Writer 15 tw *tar.Writer 16 } 17 18 // Close all closeables. 19 func (a Archive) Close() error { 20 if err := a.tw.Close(); err != nil { 21 return err 22 } 23 return a.gw.Close() 24 } 25 26 // New tar.gz archive. 27 func New(target io.Writer) Archive { 28 // the error will be nil since the compression level is valid 29 gw, _ := gzip.NewWriterLevel(target, gzip.BestCompression) 30 tw := tar.NewWriter(gw) 31 return Archive{ 32 gw: gw, 33 tw: tw, 34 } 35 } 36 37 // Add file to the archive. 38 func (a Archive) Add(name, path string) error { 39 file, err := os.Open(path) // #nosec 40 if err != nil { 41 return err 42 } 43 defer file.Close() 44 info, err := file.Stat() 45 if err != nil { 46 return err 47 } 48 header, err := tar.FileInfoHeader(info, name) 49 if err != nil { 50 return err 51 } 52 header.Name = name 53 if err = a.tw.WriteHeader(header); err != nil { 54 return err 55 } 56 if info.IsDir() { 57 return nil 58 } 59 _, err = io.Copy(a.tw, file) 60 return err 61 }