depot/packages/networking/hyprspace/cli/update.go

84 lines
2 KiB
Go

package cli
import (
"bufio"
"fmt"
"net/http"
"os"
"runtime"
"strings"
"sync"
"github.com/DataDrake/cli-ng/v2/cmd"
"github.com/inconshreveable/go-update"
"github.com/tcnksm/go-latest"
)
// Update checks for a new version of the Hyprspace program and updates itself
// if a newer version is found and the user agrees to update.
var Update = cmd.Sub{
Name: "update",
Alias: "upd",
Short: "Update Hyprspace to the lastest version.",
Args: &UpdateArgs{},
Flags: &UpdateFlags{},
Run: UpdateRun,
}
// UpdateArgs handles the specific arguments for the update command.
type UpdateArgs struct {
}
// UpdateFlags handles the specific flags for the update command.
type UpdateFlags struct {
Yes bool `short:"y" long:"yes" desc:"If a newer version is found update without prompting the user."`
}
// UpdateRun handles the checking and self updating of the AIT program.
func UpdateRun(r *cmd.Root, c *cmd.Sub) {
fmt.Printf("Current Version: %s\n", appVersion)
flags := c.Flags.(*UpdateFlags)
latestVersion := &latest.GithubTag{
Owner: "hyprspace",
Repository: "hyprspace",
}
res, _ := latest.Check(latestVersion, appVersion)
fmt.Printf("Latest Version: %s\n", res.Current)
if res.Outdated {
if !flags.Yes {
fmt.Println("Would you like to update Hyprspace to the newest version? ([y]/n)")
reader := bufio.NewReader(os.Stdin)
input, _ := reader.ReadString('\n')
input = strings.ToLower(strings.TrimSpace(input))
if input == "n" {
return
}
}
url := "https://github.com/hyprspace/hyprspace/releases/download/v" + res.Current + "/hyprspace-v" + res.Current + "-" + runtime.GOOS + "-" + runtime.GOARCH
doneChan := make(chan int, 1)
wg := sync.WaitGroup{}
wg.Add(1)
// Display Spinner on Update.
go SpinnerWait(doneChan, "Updating Hyprspace...", &wg)
resp, err := http.Get(url)
checkErr(err)
defer resp.Body.Close()
err = update.Apply(resp.Body, update.Options{})
checkErr(err)
doneChan <- 0
wg.Wait()
fmt.Print("\rUpdating Hyprspace: Done!\n")
} else {
fmt.Println("Already Up-To-Date!")
}
}