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  }