github.com/goreleaser/goreleaser@v1.25.1/pkg/archive/archive.go (about)

     1  // Package archive provides tar.gz and zip archiving
     2  package archive
     3  
     4  import (
     5  	"fmt"
     6  	"io"
     7  	"os"
     8  
     9  	"github.com/goreleaser/goreleaser/pkg/archive/gzip"
    10  	"github.com/goreleaser/goreleaser/pkg/archive/tar"
    11  	"github.com/goreleaser/goreleaser/pkg/archive/targz"
    12  	"github.com/goreleaser/goreleaser/pkg/archive/tarxz"
    13  	"github.com/goreleaser/goreleaser/pkg/archive/zip"
    14  	"github.com/goreleaser/goreleaser/pkg/config"
    15  )
    16  
    17  // Archive represents a compression archive files from disk can be written to.
    18  type Archive interface {
    19  	Close() error
    20  	Add(f config.File) error
    21  }
    22  
    23  // New archive.
    24  func New(w io.Writer, format string) (Archive, error) {
    25  	switch format {
    26  	case "tar.gz", "tgz":
    27  		return targz.New(w), nil
    28  	case "tar":
    29  		return tar.New(w), nil
    30  	case "gz":
    31  		return gzip.New(w), nil
    32  	case "tar.xz", "txz":
    33  		return tarxz.New(w), nil
    34  	case "zip":
    35  		return zip.New(w), nil
    36  	}
    37  	return nil, fmt.Errorf("invalid archive format: %s", format)
    38  }
    39  
    40  // Copying copies the source archive into a new one, which can be appended at.
    41  // Source needs to be in the specified format.
    42  func Copying(r *os.File, w io.Writer, format string) (Archive, error) {
    43  	switch format {
    44  	case "tar.gz", "tgz":
    45  		return targz.Copying(r, w)
    46  	case "tar":
    47  		return tar.Copying(r, w)
    48  	case "zip":
    49  		return zip.Copying(r, w)
    50  	}
    51  	return nil, fmt.Errorf("invalid archive format: %s", format)
    52  }