github.com/orangenpresse/up@v0.6.0/internal/cli/build/build.go (about) 1 package build 2 3 import ( 4 "archive/zip" 5 "bytes" 6 "fmt" 7 "io" 8 "os" 9 "sort" 10 11 "github.com/dustin/go-humanize" 12 "github.com/pkg/errors" 13 "github.com/tj/go/term" 14 "github.com/tj/kingpin" 15 16 "github.com/apex/up/internal/cli/root" 17 "github.com/apex/up/internal/colors" 18 "github.com/apex/up/internal/stats" 19 "github.com/apex/up/internal/util" 20 ) 21 22 func init() { 23 cmd := root.Command("build", "Build zip file.") 24 size := cmd.Flag("size", "Show zip contents size information.").Bool() 25 cmd.Example(`up build`, "Build archive and save to ./out.zip") 26 cmd.Example(`up build > /tmp/out.zip`, "Build archive and output to file via stdout.") 27 cmd.Example(`up build --size`, "Build archive and list files by size.") 28 29 cmd.Action(func(_ *kingpin.ParseContext) error { 30 defer util.Pad()() 31 32 _, p, err := root.Init() 33 if err != nil { 34 return errors.Wrap(err, "initializing") 35 } 36 37 stats.Track("Build", nil) 38 39 if err := p.Build(); err != nil { 40 return errors.Wrap(err, "building") 41 } 42 43 r, err := p.Zip() 44 if err != nil { 45 return errors.Wrap(err, "zip") 46 } 47 48 var out io.Writer 49 var buf bytes.Buffer 50 51 switch { 52 default: 53 out = os.Stdout 54 case *size: 55 out = &buf 56 case term.IsTerminal(os.Stdout.Fd()): 57 f, err := os.Create("out.zip") 58 if err != nil { 59 return errors.Wrap(err, "creating zip") 60 } 61 defer f.Close() 62 out = f 63 } 64 65 if _, err := io.Copy(out, r); err != nil { 66 return errors.Wrap(err, "copying") 67 } 68 69 if *size { 70 z, err := zip.NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len())) 71 if err != nil { 72 return errors.Wrap(err, "opening zip") 73 } 74 75 files := z.File 76 77 sort.Slice(files, func(i int, j int) bool { 78 a := files[i] 79 b := files[j] 80 return a.UncompressedSize64 > b.UncompressedSize64 81 }) 82 83 fmt.Printf("\n") 84 for _, f := range files { 85 size := humanize.Bytes(f.UncompressedSize64) 86 fmt.Printf(" %10s %s\n", size, colors.Purple(f.Name)) 87 } 88 } 89 90 return err 91 }) 92 }