github.com/hhsnopek/up@v0.1.1/internal/zip/zip.go (about)

     1  package zip
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"io/ioutil"
     7  	"os"
     8  	"strings"
     9  
    10  	"github.com/pkg/errors"
    11  	"github.com/tj/go-archive"
    12  )
    13  
    14  // Build the given `dir`.
    15  func Build(dir string) (io.ReadCloser, *archive.Stats, error) {
    16  	gitignore, err := read(".gitignore")
    17  	if err != nil {
    18  		return nil, nil, errors.Wrap(err, "reading .gitignore")
    19  	}
    20  	defer gitignore.Close()
    21  
    22  	npmignore, err := read(".npmignore")
    23  	if err != nil {
    24  		return nil, nil, errors.Wrap(err, "reading .npmignore")
    25  	}
    26  	defer npmignore.Close()
    27  
    28  	upignore, err := read(".upignore")
    29  	if err != nil {
    30  		return nil, nil, errors.Wrap(err, "reading .upignore")
    31  	}
    32  	defer upignore.Close()
    33  
    34  	r := io.MultiReader(
    35  		gitignore,
    36  		strings.NewReader("\n"),
    37  		npmignore,
    38  		strings.NewReader("\n!node_modules\n"),
    39  		upignore)
    40  
    41  	filter, err := archive.FilterPatterns(r)
    42  	if err != nil {
    43  		return nil, nil, errors.Wrap(err, "parsing ignore patterns")
    44  	}
    45  
    46  	buf := new(bytes.Buffer)
    47  	zip := archive.NewZip(buf).WithFilter(filter)
    48  
    49  	if err := zip.Open(); err != nil {
    50  		return nil, nil, errors.Wrap(err, "opening")
    51  	}
    52  
    53  	if err := zip.AddDir(dir); err != nil {
    54  		return nil, nil, errors.Wrap(err, "adding dir")
    55  	}
    56  
    57  	if err := zip.Close(); err != nil {
    58  		return nil, nil, errors.Wrap(err, "closing")
    59  	}
    60  
    61  	return ioutil.NopCloser(buf), zip.Stats(), nil
    62  }
    63  
    64  // read file.
    65  func read(path string) (io.ReadCloser, error) {
    66  	f, err := os.Open(path)
    67  
    68  	if os.IsNotExist(err) {
    69  		return ioutil.NopCloser(bytes.NewReader(nil)), nil
    70  	}
    71  
    72  	if err != nil {
    73  		return nil, err
    74  	}
    75  
    76  	return f, nil
    77  }