mirror of
https://github.com/coreybutler/nvm-windows.git
synced 2025-09-10 13:13:00 +00:00
134 lines
2.9 KiB
Go
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
|
|
}
|