Skip to content

Commit

Permalink
Merge branch '1.1.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
voidint committed Aug 25, 2019
2 parents 61a61ad + 0327883 commit bf63dd7
Show file tree
Hide file tree
Showing 18 changed files with 27,518 additions and 12,413 deletions.
36 changes: 18 additions & 18 deletions README.md
Expand Up @@ -44,8 +44,8 @@
```shell
$ g ls-remote stable
1.11.9
1.12.4
1.11.9
1.12.4
```
安装目标go版本`1.12.4`
Expand All @@ -62,26 +62,26 @@ go version go1.12.4 darwin/amd64
```shell
$ g ls
1.12.4
* 1.12.4
```
查询可供安装的所有go版本
```shell
$ g ls-remote
1
1.2.2
1.3
1.3.1
... // 省略若干版本
1.11.7
1.11.8
1.11.9
1.12
1.12.1
1.12.2
1.12.3
1.12.4
1
1.2.2
1.3
1.3.1
... // 省略若干版本
1.11.7
1.11.8
1.11.9
1.12
1.12.1
1.12.2
1.12.3
* 1.12.4
```
安装目标go版本`1.11.9`
Expand All @@ -97,8 +97,8 @@ go version go1.11.9 darwin/amd64
```shell
$ g ls
1.11.9
1.12.4
* 1.11.9
1.12.4
$ g use 1.12.4
go version go1.12.4 darwin/amd64
Expand Down
2 changes: 1 addition & 1 deletion build/build.go
Expand Up @@ -4,7 +4,7 @@ import "strings"

const (
// ShortVersion 短版本号
ShortVersion = "1.0.0"
ShortVersion = "1.1.0"
)

// The value of variables come form `gb build -ldflags '-X "build.Build=xxxxx" -X "build.CommitID=xxxx"' `
Expand Down
48 changes: 36 additions & 12 deletions cli/cli.go
Expand Up @@ -15,7 +15,7 @@ import (
)

var (
rootDir string
ghomeDir string
downloadsDir string
versionsDir string
goroot string
Expand All @@ -35,23 +35,18 @@ func Run() {
},
}
app.Before = func(ctx *cli.Context) (err error) {
homeDir, _ := os.UserHomeDir()
rootDir = filepath.Join(homeDir, ".g")
goroot = filepath.Join(rootDir, "go")
downloadsDir = filepath.Join(rootDir, "downloads")
ghomeDir = ghome()
goroot = filepath.Join(ghomeDir, "go")
downloadsDir = filepath.Join(ghomeDir, "downloads")
if err = os.MkdirAll(downloadsDir, 0755); err != nil {
return err
}
versionsDir = filepath.Join(rootDir, "versions")
if err = os.MkdirAll(versionsDir, 0755); err != nil {
return err
}
return nil
versionsDir = filepath.Join(ghomeDir, "versions")
return os.MkdirAll(versionsDir, 0755)
}
app.Commands = commands

if err := app.Run(os.Args); err != nil {
fmt.Fprintf(os.Stderr, "[g] %s\n", err.Error())
os.Exit(1)
}
}
Expand Down Expand Up @@ -87,6 +82,12 @@ func init() {
`, build.ShortVersion)
}

// ghome 返回g根目录
func ghome() (dir string) {
homeDir, _ := os.UserHomeDir()
return filepath.Join(homeDir, ".g")
}

// inuse 返回当前的go版本号
func inuse(goroot string) (version string) {
p, _ := os.Readlink(goroot)
Expand All @@ -98,11 +99,34 @@ func render(curV string, items []*semver.Version, out io.Writer) {
sort.Sort(semver.Collection(items))

for i := range items {
v := strings.TrimSuffix(strings.TrimSuffix(items[i].String(), ".0"), ".0")
fields := strings.SplitN(items[i].String(), "-", 2)
v := strings.TrimSuffix(strings.TrimSuffix(fields[0], ".0"), ".0")
if len(fields) > 1 {
v += fields[1]
}
if v == curV {
color.New(color.FgGreen).Fprintf(out, "* %s\n", v)
} else {
fmt.Fprintf(out, " %s\n", v)
}
}
}

// errstring 返回统一格式的错误信息
func errstring(err error) string {
if err == nil {
return ""
}
return wrapstring(err.Error())
}

func wrapstring(str string) string {
if str == "" {
return str
}
words := strings.Fields(str)
if len(words) > 0 {
words[0] = strings.Title(words[0])
}
return fmt.Sprintf("[g] %s", strings.Join(words, " "))
}
31 changes: 27 additions & 4 deletions cli/cli_test.go
@@ -1,6 +1,7 @@
package cli

import (
"errors"
"fmt"
"os"
"path/filepath"
Expand All @@ -12,15 +13,23 @@ import (
. "github.com/smartystreets/goconvey/convey"
)

func Test_ghome(t *testing.T) {
Convey("查询ghome路径", t, func() {
home, err := os.UserHomeDir()
So(err, ShouldBeNil)
So(ghome(), ShouldEqual, filepath.Join(home, ".g"))
})
}

func Test_inuse(t *testing.T) {
Convey("查询当前使用中的go版本", t, func() {
rootDir := filepath.Join(os.TempDir(), fmt.Sprintf(".g_%d", time.Now().Unix()))
goroot = filepath.Join(rootDir, "go")
versionsDir = filepath.Join(rootDir, "versions")
vDir := filepath.Join(versionsDir, "1.12.6")

os.MkdirAll(versionsDir, 0755)
os.MkdirAll(vDir, 0755)
_ = os.MkdirAll(versionsDir, 0755)
_ = os.MkdirAll(vDir, 0755)
defer os.RemoveAll(rootDir)

So(os.Symlink(vDir, goroot), ShouldBeNil)
Expand All @@ -31,12 +40,26 @@ func Test_inuse(t *testing.T) {
func Test_render(t *testing.T) {
Convey("渲染go版本列表", t, func() {
var buf strings.Builder
v0, _ := semver.NewVersion("1.13-beta1")
v1, _ := semver.NewVersion("1.11.11")
v2, _ := semver.NewVersion("1.7.0")
v3, _ := semver.NewVersion("1.8.1")
items := []*semver.Version{v1, v2, v3}
items := []*semver.Version{v0, v1, v2, v3}

render("1.8.1", items, &buf)
So(buf.String(), ShouldEqual, " 1.7\n* 1.8.1\n 1.11.11\n")
So(buf.String(), ShouldEqual, " 1.7\n* 1.8.1\n 1.11.11\n 1.13beta1\n")
})
}

func Test_wrapstring(t *testing.T) {
Convey("包装字符串", t, func() {
So(wrapstring("hello world"), ShouldEqual, "[g] Hello world")
})
}

func Test_errstring(t *testing.T) {
Convey("返回错误字符串", t, func() {
So(errstring(nil), ShouldBeBlank)
So(errstring(errors.New("hello world")), ShouldEqual, "[g] Hello world")
})
}
2 changes: 1 addition & 1 deletion cli/commands.go
Expand Up @@ -24,7 +24,7 @@ var (
},
{
Name: "install",
Usage: "Download and install a <version>",
Usage: "Download and install a version",
UsageText: "g install <version>",
Action: install,
},
Expand Down
24 changes: 14 additions & 10 deletions cli/install.go
Expand Up @@ -31,20 +31,20 @@ func install(ctx *cli.Context) (err error) {
// 查找版本
c, err := version.NewCollector(url)
if err != nil {
return cli.NewExitError(fmt.Sprintf("[g] %s", err.Error()), 1)
return cli.NewExitError(errstring(err), 1)
}
items, err := c.AllVersions()
if err != nil {
return cli.NewExitError(fmt.Sprintf("[g] %s", err.Error()), 1)
return cli.NewExitError(errstring(err), 1)
}
v, err := version.FindVersion(items, vname)
if err != nil {
return cli.NewExitError(fmt.Sprintf("[g] %s", err.Error()), 1)
return cli.NewExitError(errstring(err), 1)
}
// 查找版本下当前平台的安装包
pkg, err := v.FindPackage(version.ArchiveKind, runtime.GOOS, runtime.GOARCH)
if err != nil {
return cli.NewExitError(fmt.Sprintf("[g] %s", err.Error()), 1)
return cli.NewExitError(errstring(err), 1)
}
var ext string
if runtime.GOOS == "windows" {
Expand All @@ -57,30 +57,34 @@ func install(ctx *cli.Context) (err error) {
if _, err = os.Stat(filename); os.IsNotExist(err) {
// 本地不存在安装包,从远程下载并检查校验和。
if _, err = pkg.Download(filename); err != nil {
return cli.NewExitError(fmt.Sprintf("[g] %s", err.Error()), 1)
return cli.NewExitError(errstring(err), 1)
}
if err = pkg.VerifyChecksum(filename); err != nil {
return cli.NewExitError(fmt.Sprintf("[g] %s", err.Error()), 1)
return cli.NewExitError(errstring(err), 1)
}
} else {
// 本地存在安装包,检查校验和。
if err = pkg.VerifyChecksum(filename); err != nil {
return cli.NewExitError(fmt.Sprintf("[g] %s", err.Error()), 1)
_ = os.Remove(filename)
return cli.NewExitError(errstring(err), 1)
}
}
// 删除可能存在的历史垃圾文件
_ = os.RemoveAll(filepath.Join(versionsDir, "go"))

// 解压安装包
if err = archiver.Unarchive(filename, versionsDir); err != nil {
return cli.NewExitError(fmt.Sprintf("[g] %s", err.Error()), 1)
return cli.NewExitError(errstring(err), 1)
}
// 目录重命名
if err = os.Rename(filepath.Join(versionsDir, "go"), targetV); err != nil {
return cli.NewExitError(fmt.Sprintf("[g] %s", err.Error()), 1)
return cli.NewExitError(errstring(err), 1)
}
// 重新建立软链接
_ = os.Remove(goroot)

if err := os.Symlink(targetV, goroot); err != nil {
return cli.NewExitError(fmt.Sprintf("[g] %s", err.Error()), 1)
return cli.NewExitError(errstring(err), 1)
}
fmt.Println("Installed successfully")
return nil
Expand Down
17 changes: 16 additions & 1 deletion cli/ls.go
Expand Up @@ -4,6 +4,7 @@ import (
"fmt"
"io/ioutil"
"os"
"strings"

"github.com/Masterminds/semver"
"github.com/urfave/cli"
Expand All @@ -20,7 +21,21 @@ func list(ctx *cli.Context) (err error) {
if !infos[i].IsDir() {
continue
}
v, err := semver.NewVersion(infos[i].Name())
vname := infos[i].Name()
var idx int
if strings.Contains(vname, "alpha") {
idx = strings.Index(vname, "alpha")

} else if strings.Contains(vname, "beta") {
idx = strings.Index(vname, "beta")

} else if strings.Contains(vname, "rc") {
idx = strings.Index(vname, "rc")
}
if idx > 0 {
vname = vname[:idx] + "-" + vname[idx:]
}
v, err := semver.NewVersion(vname)
if err != nil || v == nil {
continue
}
Expand Down
27 changes: 22 additions & 5 deletions cli/ls_remote.go
@@ -1,8 +1,8 @@
package cli

import (
"fmt"
"os"
"strings"

"github.com/Masterminds/semver"
"github.com/urfave/cli"
Expand All @@ -11,12 +11,13 @@ import (

const (
stableChannel = "stable"
unstableChannel = "unstable"
archivedChannel = "archived"
)

func listRemote(ctx *cli.Context) (err error) {
channel := ctx.Args().First()
if channel != "" && channel != stableChannel && channel != archivedChannel {
if channel != "" && channel != stableChannel && channel != unstableChannel && channel != archivedChannel {
return cli.ShowSubcommandHelp(ctx)
}

Expand All @@ -27,25 +28,41 @@ func listRemote(ctx *cli.Context) (err error) {

c, err := version.NewCollector(url)
if err != nil {
return cli.NewExitError(fmt.Sprintf("[g] %s", err.Error()), 1)
return cli.NewExitError(errstring(err), 1)
}

var vs []*version.Version
switch channel {
case stableChannel:
vs, err = c.StableVersions()
case unstableChannel:
vs, err = c.UnstableVersions()
case archivedChannel:
vs, err = c.ArchivedVersions()
default:
vs, err = c.AllVersions()
}
if err != nil {
return cli.NewExitError(fmt.Sprintf("[g] %s", err.Error()), 1)
return cli.NewExitError(errstring(err), 1)
}

items := make([]*semver.Version, 0, len(vs))
for i := range vs {
v, err := semver.NewVersion(vs[i].Name)
vname := vs[i].Name
var idx int
if strings.Contains(vname, "alpha") {
idx = strings.Index(vname, "alpha")

} else if strings.Contains(vname, "beta") {
idx = strings.Index(vname, "beta")

} else if strings.Contains(vname, "rc") {
idx = strings.Index(vname, "rc")
}
if idx > 0 {
vname = vname[:idx] + "-" + vname[idx:]
}
v, err := semver.NewVersion(vname)
if err != nil || v == nil {
continue
}
Expand Down

0 comments on commit bf63dd7

Please sign in to comment.