84 lines
2 KiB
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!")
|
||
|
}
|
||
|
}
|