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  }