Files
nvm-windows/updater/nvm-update.go
2022-11-01 08:23:24 -05:00

134 lines
2.9 KiB
Go

package main
import (
"bytes"
"fmt"
"nvm/web"
"os"
"os/exec"
"path/filepath"
"strings"
"time"
"github.com/blang/semver"
"github.com/coreybutler/go-fsutil"
"github.com/gen2brain/dlgs"
"golang.org/x/sys/windows/registry"
)
var version = "1.1.10"
func main() {
// baseVersion := version
args := os.Args
if len(args) > 1 {
version = args[1]
}
root := os.Getenv("NVM_HOME")
if root == "" {
fmt.Println("Cannot find NVM_HOME")
os.Exit(1)
}
exe := filepath.Join(root, "nvm.exe")
currentNvmVersion, err := semver.Make(strings.TrimSpace(run(exe, "version")))
if err != nil {
fmt.Println("NVM for Windows installation not found in " + root)
os.Exit(1)
}
err = currentNvmVersion.Validate()
if err != nil {
fmt.Println("NVM for Windows installation not found in " + root)
os.Exit(1)
}
if !contains(args, "/S") && !contains(args, "/s") {
item, _, err := dlgs.Entry("NVM Upgrade", "Upgrade to which version?", version)
if err != nil || len(strings.TrimSpace(item)) == 0 {
fmt.Println("Upgrade cancelled")
os.Exit(0)
}
version = item
}
newNvmVersion, err := semver.Make(version)
if err != nil {
fmt.Println("Version " + version + " is not recognized or does not exist")
os.Exit(1)
}
err = newNvmVersion.Validate()
if err != nil {
fmt.Println("Invalid version: " + version)
os.Exit(1)
}
if newNvmVersion.LTE(currentNvmVersion) {
fmt.Printf("No upgrade necessary. Already running v%s.", currentNvmVersion.String())
os.Exit(0)
}
tmpdir := filepath.Join(root, "tmp")
zipfile := filepath.Join(tmpdir, "install.zip")
os.RemoveAll(tmpdir)
fsutil.Touch(tmpdir)
fmt.Println("Downloading NVM for Windows v" + version)
success := web.Download("https://github.com/coreybutler/nvm-windows/releases/download/"+version+"/nvm-noinstall.zip", zipfile)
if !success {
os.RemoveAll(tmpdir)
os.Exit(1)
}
fmt.Println(" - Extracting")
web.Unzip(zipfile, tmpdir)
os.RemoveAll(zipfile)
fmt.Println(" - Updating")
fsutil.Move(tmpdir, root)
os.RemoveAll(tmpdir)
version := strings.TrimSpace(run(exe, "version"))
key, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\40078385-F676-4C61-9A9C-F9028599D6D3_is1`, registry.QUERY_VALUE)
if err == nil {
defer key.Close()
key.SetStringValue("DisplayVersion", version)
key.SetStringValue("DisplayName", "NVM for Windows "+version)
current := time.Now()
key.SetStringValue("InstallDate", current.Format("20060102"))
}
fmt.Printf("\nUpgraded to NVM for Windows v%v", version)
}
func run(command ...string) string {
base := command[0]
args := command[1:]
cmd := exec.Command(base, args...)
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
return err.Error()
}
return out.String()
}
func contains(src []string, pattern string) bool {
for _, arg := range src {
if arg == pattern {
return true
}
}
return false
}