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 }