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  }