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  }