github.com/joselitofilho/goreleaser@v0.155.1-0.20210123221854-e4891856c593/pkg/archive/zip/zip.go (about)

     1  // Package zip implements the Archive interface providing zip archiving
     2  // and compression.
     3  package zip
     4  
     5  import (
     6  	"archive/zip"
     7  	"compress/flate"
     8  	"io"
     9  	"os"
    10  )
    11  
    12  // Archive zip struct.
    13  type Archive struct {
    14  	z *zip.Writer
    15  }
    16  
    17  // Close all closeables.
    18  func (a Archive) Close() error {
    19  	return a.z.Close()
    20  }
    21  
    22  // New zip archive.
    23  func New(target io.Writer) Archive {
    24  	compressor := zip.NewWriter(target)
    25  	compressor.RegisterCompressor(zip.Deflate, func(out io.Writer) (io.WriteCloser, error) {
    26  		return flate.NewWriter(out, flate.BestCompression)
    27  	})
    28  	return Archive{
    29  		z: compressor,
    30  	}
    31  }
    32  
    33  // Add a file to the zip archive.
    34  func (a Archive) Add(name, path string) (err error) {
    35  	file, err := os.Open(path) // #nosec
    36  	if err != nil {
    37  		return
    38  	}
    39  	defer file.Close()
    40  	info, err := file.Stat()
    41  	if err != nil {
    42  		return
    43  	}
    44  	if info.IsDir() {
    45  		return
    46  	}
    47  	header, err := zip.FileInfoHeader(info)
    48  	if err != nil {
    49  		return err
    50  	}
    51  	header.Name = name
    52  	header.Method = zip.Deflate
    53  	w, err := a.z.CreateHeader(header)
    54  	if err != nil {
    55  		return err
    56  	}
    57  	_, err = io.Copy(w, file)
    58  	return err
    59  }