github.com/devster/tarreleaser@v0.0.0-20221207180803-c608f4eb8918/pkg/archive/targz/targz.go (about) 1 // Package targz implements the Archive interface providing tar.gz archiving and compression. 2 package targz 3 4 import ( 5 "archive/tar" 6 "compress/gzip" 7 "io" 8 "os" 9 "time" 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, level int) (*Archive, error) { 28 gw, err := gzip.NewWriterLevel(target, level) 29 if err != nil { 30 return &Archive{}, err 31 } 32 tw := tar.NewWriter(gw) 33 return &Archive{ 34 gw: gw, 35 tw: tw, 36 }, nil 37 } 38 39 // Add file to the archive 40 func (a Archive) Add(name, path string) error { 41 file, err := os.Open(path) 42 if err != nil { 43 return err 44 } 45 defer file.Close() 46 info, err := file.Stat() 47 if err != nil { 48 return err 49 } 50 header, err := tar.FileInfoHeader(info, name) 51 if err != nil { 52 return err 53 } 54 header.Name = name 55 if err = a.tw.WriteHeader(header); err != nil { 56 return err 57 } 58 if info.IsDir() { 59 return nil 60 } 61 _, err = io.Copy(a.tw, file) 62 return err 63 } 64 65 // Add file from content to the archive 66 func (a Archive) AddFromString(name, content string, mode int64) error { 67 header := new(tar.Header) 68 header.Name = name 69 header.Size = int64(len(content)) 70 header.Mode = mode 71 header.ModTime = time.Now() 72 73 if err := a.tw.WriteHeader(header); err != nil { 74 return err 75 } 76 77 _, err := a.tw.Write([]byte(content)) 78 return err 79 }