github.com/fnando/bolt@v0.0.4-0.20231107225351-5241e4d187b8/internal/commands/update.go (about) 1 package commands 2 3 import ( 4 "bufio" 5 "bytes" 6 "flag" 7 "fmt" 8 "io" 9 "net/http" 10 "os" 11 12 c "github.com/fnando/bolt/common" 13 ) 14 15 func Update(args []string, output *c.Output) int { 16 var b bytes.Buffer 17 buffer := bufio.NewWriter(&b) 18 19 flags := flag.NewFlagSet("bolt update", flag.ContinueOnError) 20 flags.SetOutput(buffer) 21 err := flags.Parse(args) 22 23 usage := ` 24 Download the latest binary matching the one being executed, and replace it. 25 26 Usage: bolt update 27 ` 28 29 if err == flag.ErrHelp { 30 fmt.Fprintln(output.Stdout, usage) 31 return 0 32 } 33 34 if err != nil { 35 fmt.Fprintf(output.Stderr, "%s %v\n", c.Color.Fail("ERROR:"), err) 36 return 1 37 } 38 39 binary, _ := os.Executable() 40 out, err := os.Create(binary) 41 42 if err != nil { 43 fmt.Fprintf(output.Stderr, "%s %v\n", c.Color.Fail("ERROR:"), err) 44 return 1 45 } 46 47 defer out.Close() 48 resp, err := http.Get(c.DownloadURL) 49 50 if err != nil { 51 fmt.Fprintf(output.Stderr, "%s %v\n", c.Color.Fail("ERROR:"), err) 52 return 1 53 } 54 55 defer resp.Body.Close() 56 _, err = io.Copy(out, resp.Body) 57 58 if err != nil { 59 fmt.Fprintf(output.Stderr, "%s %v\n", c.Color.Fail("ERROR:"), err) 60 return 1 61 } 62 63 return 0 64 }