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  }