/* Uninstall node and npm Param: - folder: version */ func Uninstall(folder string) { // try catch defer func() { if err := recover(); err != nil { msg := fmt.Sprintf("gnvm uninstall %v an error has occurred. please check your input. \nError: ", folder) Error(ERROR, msg, err) os.Exit(0) } }() // set removePath removePath := rootPath + folder if folder == util.UNKNOWN { P(ERROR, "current latest version is %v, please usage '%v' first. See '%v'.\n", folder, "gnvm update latest", "gnvm help update") return } // rootPath/version is exist if util.IsDirExist(removePath) != true { P(ERROR, "%v folder is not exist. See '%v'.\n", folder, "gnvm ls") return } // remove rootPath/version folder if err := os.RemoveAll(removePath); err != nil { P(ERROR, "uninstall %v fail, Error: %v.\n", folder, err.Error()) return } P(DEFAULT, "Node.js version %v uninstall success.\n", folder) }
/* Create node_modules folder */ func (this *NPMange) CreateModules() { if !util.IsDirExist(this.modules) { if err := os.Mkdir(this.modules, 0755); err != nil { P(ERROR, "create %v foler error, Error: %v\n", this.modules, err.Error()) } else { P(NOTICE, "%v folder create success.\n", this.modules) } } }
/* Remove file Param: - path: olny clude path - <root>/node_modules/npm - <root>/npm - <root>/npm.cmd - <root>/<npm.zip> */ func (this *NPMange) Clean(path string) error { if util.IsDirExist(path) { if err := os.RemoveAll(path); err != nil { P(ERROR, "remove %v folder Error: %v.\n", path, err.Error()) return err } } return nil }
/* Update local Node.js latest verion - localVersion, remoteVersion: string Node.js version - local, remote: float64 Node.js version Param: - global: when global == true, call Use func. */ func Update(global bool) { // try catch defer func() { if err := recover(); err != nil { msg := fmt.Sprintf("'%v' an error has occurred. \nError: ", "gnvm updte latest") Error(ERROR, msg, err) os.Exit(0) } }() localVersion, remoteVersion := config.GetConfig(config.LATEST_VERSION), util.GetLatVer(latURL) P(NOTICE, "local Node.js latest version is %v.\n", localVersion) if remoteVersion == "" { P(ERROR, "get latest version error, please check. See '%v'.\n", "gnvm help config") return } P(NOTICE, "remote Node.js latest version is %v from %v.\n", remoteVersion, config.GetConfig("registry")) local, remote, args := util.FormatNodeVer(localVersion), util.FormatNodeVer(remoteVersion), []string{remoteVersion} switch { case localVersion == util.UNKNOWN: if code := InstallNode(args, global); code == 0 { config.SetConfig(config.LATEST_VERSION, remoteVersion) P(DEFAULT, "Update Node.js latest success, current latest version is %v.\n", remoteVersion) } case local == remote: if util.IsDirExist(rootPath + localVersion) { cp := CP{Red, false, None, false, "="} P(DEFAULT, "Remote latest version %v %v latest version %v, don't need to upgrade.\n", remoteVersion, cp, localVersion) if global { if ok := Use(localVersion); ok { config.SetConfig(config.GLOBAL_VERSION, localVersion) } } } else { P(WARING, "%v folder is not exist. See '%v'.\n", localVersion, "gnvm ls") if code := InstallNode(args, global); code == 0 { P(DEFAULT, "Local Node.js latest version is %v.\n", localVersion) } } case local > remote: cp := CP{Red, false, None, false, ">"} P(WARING, "local latest version %v %v remote latest version %v.\nPlease check your config %v. See '%v'.\n", localVersion, cp, remoteVersion, "registry", "gnvm help config") case local < remote: cp := CP{Red, false, None, false, ">"} P(WARING, "remote latest version %v %v local latest version %v.\n", remoteVersion, cp, localVersion) if code := InstallNode(args, global); code == 0 { config.SetConfig(config.LATEST_VERSION, remoteVersion) P(DEFAULT, "Update success, Node.js latest version is %v.\n", remoteVersion) } } }
func testIsDirExist() { // empty fmt.Println(util.IsDirExist("")) // no exist fmt.Println(util.IsDirExist(`C:\Users\Kenshin\Documents\DevTools\nodejss`)) fmt.Println(util.IsDirExist(`C:\Users\Kenshin\Documents\DevTools\nodejs\node_moduless\npm`)) fmt.Println(util.IsDirExist(`C:\Users\Kenshin\Documents\DevTools\nodejs\5.1.1\node.exe`)) // exist fmt.Println(util.IsDirExist(`C:\Users\Kenshin\Documents\DevTools\nodejs`)) fmt.Println(util.IsDirExist(`C:\Users\Kenshin\Documents\DevTools\nodejs\node_modules`)) // not valid path fmt.Println(util.IsDirExist("gnvm")) // exist fmt.Println(util.IsDirExist(`C:\Users\Kenshin\Documents\DevTools\nodejs\5.9.1\node.exe`)) fmt.Println(util.IsDirExist(`C:\Users\Kenshin\Documents\DevTools`, `nodejs`, `5.1.1`)) }
/* Print current local Node.js version list Param: - isPrint: when isPrint == true, print console */ func LS(isPrint bool) ([]string, error) { // try catch defer func() { if err := recover(); err != nil { Error(ERROR, "'gnvm ls' an error has occurred. please check. \nError: ", err) os.Exit(0) } }() var lsArr []string existVersion := false files, err := ioutil.ReadDir(rootPath) // show error if err != nil { P(ERROR, "'%v' Error: %v.\n", "gnvm ls", err.Error()) return lsArr, err } P(NOTICE, "gnvm.exe root is %v \n", rootPath) for _, file := range files { // set version version := file.Name() // check node version if util.VerifyNodeVer(version) { // <root>/x.xx.xx/node.exe is exist if util.IsDirExist(rootPath + version + util.DIVIDE + util.NODE) { desc := "" switch { case version == config.GetConfig(config.GLOBAL_VERSION) && version == config.GetConfig(config.LATEST_VERSION): desc = " -- global, latest" case version == config.GetConfig(config.LATEST_VERSION): desc = " -- latest" case version == config.GetConfig(config.GLOBAL_VERSION): desc = " -- global" } ver, _, _, suffix, _ := util.ParseNodeVer(version) if suffix == "x86" { desc = " -- x86" } else if suffix == "x64" { desc = " -- x64" } // set true existVersion = true // set lsArr lsArr = append(lsArr, version) if isPrint { if desc == "" { P(DEFAULT, "v"+ver+desc, "\n") } else { P(DEFAULT, "%v", "v"+ver+desc, "\n") } } } } } // version is exist if !existVersion { P(WARING, "don't have any available Node.js version, please check your input. See '%v'.\n", "gnvm help install") } return lsArr, err }
/** * rootPath : node.exe global path, e.g. x:\xxx\xx\xx\ * * global : global node.exe version num, e.g. x.xx.xx-x86 ( only rumtime.GOARCH == "amd64", suffix include: 'x86' and 'x64' ) * globalPath : global node.exe version path, e.g. x:\xxx\xx\xx\x.xx.xx-x86 * * newer : newer node.exe version num, e.g. x.xx.xx * newerPath : newer node.exe version path, e.g. <rootPath>\x.xx.xx\ * */ func Use(newer string) bool { // try catch defer func() { if err := recover(); err != nil { msg := fmt.Sprintf("'gnvm use %v' an error has occurred. please check. \nError: ", newer) Error(ERROR, msg, err) os.Exit(0) } }() // get true folder, e.g. folder is latest return x.xx.xx util.FormatLatVer(&newer, config.GetConfig(config.LATEST_VERSION), true) if newer == util.UNKNOWN { P(WARING, "current latest is %v, please usage '%v' first. See '%v'.\n", newer, "gnvm update latest", "gnvm help update") return false } // set newerPath and verify newerPath is exist? newerPath := rootPath + newer if _, err := util.GetNodeVer(newerPath); err != nil { P(WARING, "%v folder is not exist %v, use '%v' get local Node.js version list. See '%v'.\n", newer, "node.exe", "gnvm ls", "gnvm help ls") return false } // get <root>/node.exe version, when exist, get full version, e.g. x.xx.xx-x86 global, err := util.GetNodeVer(rootPath) if err != nil { P(WARING, "not found %v Node.js version.\n", "global") } else { if bit, err := util.Arch(rootPath); err == nil { if bit == "x86" && runtime.GOARCH == "amd64" { global += "-" + bit } } } // check newer is global if newer == global { P(WARING, "current Node.js version is %v, not re-use. See '%v'.\n", newer, "gnvm node-version") return false } // set globalPath globalPath := rootPath + global // <root>/global is exist? when not exist, create global folder if !util.IsDirExist(globalPath) { if err := os.Mkdir(globalPath, 0777); err != nil { P(ERROR, "create %v folder Error: %v.\n", global, err.Error()) return false } } // backup copy <root>/node.exe to <root>/global/node.exe if global != "" { if err := util.Copy(rootPath, globalPath, util.NODE); err != nil { P(ERROR, "copy %v to %v folder Error: %v.\n", rootPath, globalPath, err.Error()) return false } } // copy <root>/newer/node.exe to <root>/node.exe if err := util.Copy(newerPath, rootPath, util.NODE); err != nil { P(ERROR, "copy %v to %v folder Error: %v.\n", newerPath, rootPath, err.Error()) return false } P(DEFAULT, "Set success, global Node.js version is %v.\n", newer) return true }