github.com/axxelG/goreleaser@v0.92.0/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  	"io"
     8  	"os"
     9  )
    10  
    11  // Archive zip struct
    12  type Archive struct {
    13  	z *zip.Writer
    14  }
    15  
    16  // Close all closeables
    17  func (a Archive) Close() error {
    18  	return a.z.Close()
    19  }
    20  
    21  // New zip archive
    22  func New(target io.Writer) Archive {
    23  	return Archive{
    24  		z: zip.NewWriter(target),
    25  	}
    26  }
    27  
    28  // Add a file to the zip archive
    29  func (a Archive) Add(name, path string) (err error) {
    30  	file, err := os.Open(path) // #nosec
    31  	if err != nil {
    32  		return
    33  	}
    34  	defer file.Close() // nolint: errcheck
    35  	info, err := file.Stat()
    36  	if err != nil {
    37  		return
    38  	}
    39  	if info.IsDir() {
    40  		return
    41  	}
    42  	header, err := zip.FileInfoHeader(info)
    43  	if err != nil {
    44  		return err
    45  	}
    46  	header.Name = name
    47  	header.Method = zip.Deflate
    48  	w, err := a.z.CreateHeader(header)
    49  	if err != nil {
    50  		return err
    51  	}
    52  	_, err = io.Copy(w, file)
    53  	return err
    54  }