github.com/client9/goreleaser@v0.17.4-0.20170511023544-27e4b028926d/pipeline/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 if err := a.gw.Close(); err != nil { 24 return err 25 } 26 return nil 27 } 28 29 // New tar.gz archive 30 func New(target *os.File) Archive { 31 gw := gzip.NewWriter(target) 32 tw := tar.NewWriter(gw) 33 return Archive{ 34 gw: gw, 35 tw: tw, 36 } 37 } 38 39 // Add file to the archive 40 func (a Archive) Add(name, path string) (err error) { 41 file, err := os.Open(path) 42 if err != nil { 43 return 44 } 45 defer func() { 46 _ = file.Close() 47 }() 48 stat, err := file.Stat() 49 if err != nil { 50 return 51 } 52 header := new(tar.Header) 53 header.Name = name 54 header.Size = stat.Size() 55 header.Mode = int64(stat.Mode()) 56 header.ModTime = stat.ModTime() 57 if err := a.tw.WriteHeader(header); err != nil { 58 return err 59 } 60 if _, err := io.Copy(a.tw, file); err != nil { 61 return err 62 } 63 return 64 }