github.com/axxelG/goreleaser@v0.92.0/pkg/archive/tar/tar.go (about) 1 // Package tar implements the Archive interface providing tar.gz archiving 2 // and compression. 3 package tar 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 gw := gzip.NewWriter(target) 29 tw := tar.NewWriter(gw) 30 return Archive{ 31 gw: gw, 32 tw: tw, 33 } 34 } 35 36 // Add file to the archive 37 func (a Archive) Add(name, path string) error { 38 file, err := os.Open(path) // #nosec 39 if err != nil { 40 return err 41 } 42 defer file.Close() // nolint: errcheck 43 info, err := file.Stat() 44 if err != nil { 45 return err 46 } 47 header, err := tar.FileInfoHeader(info, name) 48 if err != nil { 49 return err 50 } 51 header.Name = name 52 if err = a.tw.WriteHeader(header); err != nil { 53 return err 54 } 55 if info.IsDir() { 56 return nil 57 } 58 _, err = io.Copy(a.tw, file) 59 return err 60 }