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 }