github.com/franciscocpg/up@v0.1.10/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  var transform = archive.TransformFunc(func(r io.Reader, i os.FileInfo) (io.Reader, os.FileInfo) {
    15  	switch i.Name() {
    16  	case "main", "server":
    17  		i = archive.Info{
    18  			Name:     i.Name(),
    19  			Size:     i.Size(),
    20  			Mode:     i.Mode() | 0555,
    21  			Modified: i.ModTime(),
    22  			Dir:      i.IsDir(),
    23  		}.FileInfo()
    24  	}
    25  
    26  	return r, i
    27  })
    28  
    29  // Build the given `dir`.
    30  func Build(dir string) (io.ReadCloser, *archive.Stats, error) {
    31  	gitignore, err := read(".gitignore")
    32  	if err != nil {
    33  		return nil, nil, errors.Wrap(err, "reading .gitignore")
    34  	}
    35  	defer gitignore.Close()
    36  
    37  	npmignore, err := read(".npmignore")
    38  	if err != nil {
    39  		return nil, nil, errors.Wrap(err, "reading .npmignore")
    40  	}
    41  	defer npmignore.Close()
    42  
    43  	upignore, err := read(".upignore")
    44  	if err != nil {
    45  		return nil, nil, errors.Wrap(err, "reading .upignore")
    46  	}
    47  	defer upignore.Close()
    48  
    49  	r := io.MultiReader(
    50  		gitignore,
    51  		strings.NewReader("\n"),
    52  		npmignore,
    53  		strings.NewReader("\n!node_modules\n"),
    54  		upignore,
    55  		strings.NewReader("\n!main\n!_proxy.js\n!byline.js\n!up.json\n"))
    56  
    57  	filter, err := archive.FilterPatterns(r)
    58  	if err != nil {
    59  		return nil, nil, errors.Wrap(err, "parsing ignore patterns")
    60  	}
    61  
    62  	buf := new(bytes.Buffer)
    63  	zip := archive.NewZip(buf).
    64  		WithFilter(filter).
    65  		WithTransform(transform)
    66  
    67  	if err := zip.Open(); err != nil {
    68  		return nil, nil, errors.Wrap(err, "opening")
    69  	}
    70  
    71  	if err := zip.AddDir(dir); err != nil {
    72  		return nil, nil, errors.Wrap(err, "adding dir")
    73  	}
    74  
    75  	if err := zip.Close(); err != nil {
    76  		return nil, nil, errors.Wrap(err, "closing")
    77  	}
    78  
    79  	return ioutil.NopCloser(buf), zip.Stats(), nil
    80  }
    81  
    82  // read file.
    83  func read(path string) (io.ReadCloser, error) {
    84  	f, err := os.Open(path)
    85  
    86  	if os.IsNotExist(err) {
    87  		return ioutil.NopCloser(bytes.NewReader(nil)), nil
    88  	}
    89  
    90  	if err != nil {
    91  		return nil, err
    92  	}
    93  
    94  	return f, nil
    95  }