Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions internal/cmdCli/cmds.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package cmdCli

import (
"github.com/codegangsta/cli"
"github.com/ystyle/jvms/internal/entity"
)

type CommandParams struct {
DefaultOriginalPath string
Config *entity.Config
}

func Commands(cp *CommandParams) []cli.Command {
cmds := []cli.Command{
*init_(cp.DefaultOriginalPath, cp.Config),
*list(cp.Config),
*install(cp.Config),
*switch_(cp.Config),
*use(cp.Config),
*remove(cp.Config),
*rls(cp.Config),
*proxy(cp.Config),
}
return cmds
}
57 changes: 57 additions & 0 deletions internal/cmdCli/init.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package cmdCli

import (
"errors"
"fmt"
"os"
"os/exec"
"path/filepath"

"github.com/codegangsta/cli"
"github.com/ystyle/jvms/internal/entity"
"github.com/ystyle/jvms/utils/file"
)

func init_(defaultOriginalpath string, cfx *entity.Config) *cli.Command {
return &cli.Command{
Name: "init",
Usage: "Initialize config file",
Description: `before init you should clear JAVA_HOME, PATH Environment variable。`,
Flags: []cli.Flag{
cli.StringFlag{
Name: "java_home",
Usage: "the JAVA_HOME location",
Value: filepath.Join(os.Getenv("ProgramFiles"), "jdk"),
},
cli.StringFlag{
Name: "originalpath",
Usage: "the jdk download index file url.",
Value: defaultOriginalpath,
},
},
Action: func(c *cli.Context) error {
if c.IsSet("java_home") || cfx.JavaHome == "" {
cfx.JavaHome = c.String("java_home")
}
cmd := exec.Command("cmd", "/C", "setx", "JAVA_HOME", cfx.JavaHome, "/M")
err := cmd.Run()
if err != nil {
return errors.New("set Environment variable `JAVA_HOME` failure: Please run as admin user")
}
fmt.Println("set `JAVA_HOME` Environment variable to ", cfx.JavaHome)

if c.IsSet("originalpath") || cfx.Originalpath == "" {
cfx.Originalpath = c.String("originalpath")
}
path := fmt.Sprintf(`%s/bin;%s;%s`, cfx.JavaHome, os.Getenv("PATH"), file.GetCurrentPath())
cmd = exec.Command("cmd", "/C", "setx", "path", path, "/m")
err = cmd.Run()
if err != nil {
return errors.New("set Environment variable `PATH` failure: Please run as admin user")
}
fmt.Println("add jvms.exe to `path` Environment variable")
return nil
},
}

}
86 changes: 86 additions & 0 deletions internal/cmdCli/install.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package cmdCli

import (
"errors"
"fmt"
"os"
"path/filepath"

"github.com/codegangsta/cli"
"github.com/ystyle/jvms/internal/entity"
"github.com/ystyle/jvms/utils/file"
"github.com/ystyle/jvms/utils/jdk"
"github.com/ystyle/jvms/utils/web"
)

func install(cfx *entity.Config) *cli.Command {
cmd := &cli.Command{
Name: "install",
ShortName: "i",
Usage: "Install available remote jdk",
Action: func(c *cli.Context) error {
if cfx.Proxy != "" {
web.SetProxy(cfx.Proxy)
}
v := c.Args().Get(0)
if v == "" {
return errors.New("invalid version., Type \"jvms rls\" to see what is available for install")
}

if jdk.IsVersionInstalled(cfx.Store, v) {
fmt.Println("Version " + v + " is already installed.")
return nil
}
versions, err := getJdkVersions(cfx)
if err != nil {
return err
}

if !file.Exists(cfx.Download) {
os.MkdirAll(cfx.Download, 0777)
}
if !file.Exists(cfx.Store) {
os.MkdirAll(cfx.Store, 0777)
}

for _, version := range versions {
if version.Version == v {
dlzipfile, success := web.GetJDK(cfx.Download, v, version.Url)
if success {
fmt.Printf("Installing JDK %s ...\n", v)

// Extract jdk to the temp directory
jdktempfile := filepath.Join(cfx.Download, fmt.Sprintf("%s_temp", v))
if file.Exists(jdktempfile) {
err := os.RemoveAll(jdktempfile)
if err != nil {
panic(err)
}
}
err := file.Unzip(dlzipfile, jdktempfile)
if err != nil {
return fmt.Errorf("unzip failed: %w", err)
}

// Copy the jdk files to the installation directory
temJavaHome := getJavaHome(jdktempfile)
err = os.Rename(temJavaHome, filepath.Join(cfx.Store, v))
if err != nil {
return fmt.Errorf("unzip failed: %w", err)
}

// Remove the temp directory
// may consider keep the temp files here
os.RemoveAll(jdktempfile)
fmt.Printf("Installation completedly succesfully. Use: jvms switch %v, if you'd like to use this version", v)
} else {
fmt.Println("Could not download JDK " + v + " executable.")
}
return nil
}
}
return errors.New("invalid version., Type \"jvms rls\" to see what is available for install")
},
}
return cmd
}
35 changes: 35 additions & 0 deletions internal/cmdCli/list.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package cmdCli

import (
"fmt"

"github.com/codegangsta/cli"
"github.com/ystyle/jvms/internal/entity"
"github.com/ystyle/jvms/utils/jdk"
)

func list(cfx *entity.Config) *cli.Command {
cmd := &cli.Command{
Name: "list",
ShortName: "ls",
Usage: "List current JDK installations.",
Action: func(c *cli.Context) error {
fmt.Println("Installed jdk (* marks in use):")
v := jdk.GetInstalled(cfx.Store)
for i, version := range v {
str := ""
if cfx.CurrentJDKVersion == version {
str = fmt.Sprintf("%s * %d) %s", str, i+1, version)
} else {
str = fmt.Sprintf("%s %d) %s", str, i+1, version)
}
fmt.Printf(str + "\n")
}
if len(v) == 0 {
fmt.Println("No installations recognized.")
}
return nil
},
}
return cmd
}
36 changes: 36 additions & 0 deletions internal/cmdCli/proxy.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package cmdCli

import (
"fmt"

"github.com/codegangsta/cli"
"github.com/ystyle/jvms/internal/entity"
)

func proxy(cfx *entity.Config) *cli.Command {
cmd := &cli.Command{
Name: "proxy",
Usage: "Set a proxy to use for downloads.",
Flags: []cli.Flag{
cli.BoolFlag{
Name: "show",
Usage: "show proxy.",
},
cli.StringFlag{
Name: "set",
Usage: "set proxy.",
},
},
Action: func(c *cli.Context) error {
if c.Bool("show") {
fmt.Printf("Current proxy: %s\n", cfx.Proxy)
return nil
}
if c.IsSet("set") {
cfx.Proxy = c.String("set")
}
return nil
},
}
return cmd
}
45 changes: 45 additions & 0 deletions internal/cmdCli/rels.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package cmdCli

import (
"fmt"

"github.com/codegangsta/cli"
"github.com/ystyle/jvms/internal/entity"
"github.com/ystyle/jvms/utils/web"
)

func rls(cfx *entity.Config) *cli.Command {
cmd := &cli.Command{
Name: "rls",
Usage: "Show a list of versions available for download. ",
Flags: []cli.Flag{
cli.BoolFlag{
Name: "a",
Usage: "list all the version",
},
},
Action: func(c *cli.Context) error {
if cfx.Proxy != "" {
web.SetProxy(cfx.Proxy)
}
versions, err := getJdkVersions(cfx)
if err != nil {
return err
}
for i, version := range versions {
fmt.Printf(" %d) %s\n", i+1, version.Version)
if !c.Bool("a") && i >= 9 {
fmt.Println("\nuse \"jvm rls -a\" show all the versions ")
break
}
}
if len(versions) == 0 {
fmt.Println("No availabled jdk veriosn for download.")
}

fmt.Printf("\nFor a complete list, visit %s\n", cfx.Originalpath)
return nil
},
}
return cmd
}
44 changes: 44 additions & 0 deletions internal/cmdCli/remove.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package cmdCli

import (
"errors"
"fmt"
"os"
"path/filepath"

"github.com/codegangsta/cli"
"github.com/ystyle/jvms/internal/entity"
"github.com/ystyle/jvms/utils/jdk"
)

func remove(cfx *entity.Config) *cli.Command {
cmd := &cli.Command{
Name: "remove",
ShortName: "rm",
Usage: "Remove a specific version.",
Action: func(c *cli.Context) error {
v := c.Args().Get(0)
if v == "" {
return errors.New("you should input a version, Type \"jvms list\" to see what is installed")
}
if jdk.IsVersionInstalled(cfx.Store, v) {
fmt.Printf("Remove JDK %s ...\n", v)
if cfx.CurrentJDKVersion == v {
os.Remove(cfx.JavaHome)
}
dir := filepath.Join(cfx.Store, v)
e := os.RemoveAll(dir)
if e != nil {
fmt.Println("Error removing jdk " + v)
fmt.Println("Manually remove " + dir + ".")
} else {
fmt.Printf(" done")
}
} else {
fmt.Println("jdk " + v + " is not installed. Type \"jvms list\" to see what is installed.")
}
return nil
},
}
return cmd
}
Loading