Skip to content

Commit 72fccc1

Browse files
committed
upgrade support
1 parent d7d3cf9 commit 72fccc1

4 files changed

Lines changed: 155 additions & 1 deletion

File tree

cmd/root.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ var defaultVersion = "v3"
1818

1919
func init() {
2020
// 根据openapi 生成接口文档
21-
rootCmd.AddCommand(startCmd, initCmd, reloadCmd)
21+
rootCmd.AddCommand(startCmd, initCmd, reloadCmd, upgradeCmd)
2222
}
2323

2424
func Run() error {

cmd/upgrade.go

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package cmd
2+
3+
import (
4+
"archive/zip"
5+
"encoding/json"
6+
"errors"
7+
"fmt"
8+
"github.com/samber/lo"
9+
"github.com/schollz/progressbar/v3"
10+
"github.com/spf13/cobra"
11+
"io"
12+
"net/http"
13+
"os"
14+
"path/filepath"
15+
"runtime"
16+
"strings"
17+
"time"
18+
)
19+
20+
var upgradeCmd = &cobra.Command{
21+
Use: "upgrade",
22+
Short: "Upgrade to the latest version or specified version",
23+
RunE: func(cmd *cobra.Command, args []string) error {
24+
if repoUrl != "" {
25+
return downloadInstall(repoUrl)
26+
}
27+
28+
//查询 github
29+
assets, err := downloadCheck(repoVersion)
30+
if err != nil {
31+
return err
32+
}
33+
return downloadInstall(assets.Url)
34+
},
35+
}
36+
37+
func init() {
38+
upgradeCmd.Flags().StringVarP(&repoUrl, "download url", "d", repoUrl, "repo download url")
39+
upgradeCmd.Flags().StringVarP(&repoVersion, "repo version", "v", repoVersion, "repo version")
40+
}
41+
42+
const repo = "https://api.github.com/repos/otk-final/openapi-codegen/releases"
43+
44+
var repoUrl = ""
45+
var repoVersion = "latest"
46+
var repoName = "openapi"
47+
48+
type Assets struct {
49+
Name string `json:"name"`
50+
Url string `json:"browser_download_url"`
51+
}
52+
type RepoInfo struct {
53+
Tag string `json:"tag"`
54+
Name string `json:"name"`
55+
CreatedAt string `json:"created_at"`
56+
PublishedAt string `json:"published_at"`
57+
Assets []*Assets `json:"assets"`
58+
}
59+
60+
func downloadCheck(version string) (*Assets, error) {
61+
62+
//查询
63+
resp, err := http.Get(repo + "/" + version)
64+
if err != nil {
65+
return nil, err
66+
}
67+
defer func() {
68+
_ = resp.Body.Close()
69+
}()
70+
71+
body, _ := io.ReadAll(resp.Body)
72+
73+
//解码
74+
var info RepoInfo
75+
_ = json.Unmarshal(body, &info)
76+
77+
//获取当前os 安装包
78+
assets, ok := lo.Find(info.Assets, func(item *Assets) bool {
79+
return strings.Contains(item.Name, runtime.GOOS)
80+
})
81+
if ok {
82+
return assets, nil
83+
}
84+
return nil, errors.New("not found assets")
85+
}
86+
87+
func downloadInstall(url string) error {
88+
fmt.Printf("start download %s\n", url)
89+
90+
//下载
91+
resp, err := http.Get(url)
92+
if err != nil {
93+
return err
94+
}
95+
96+
defer func() {
97+
_ = resp.Body.Close()
98+
}()
99+
100+
//临时目录 文件
101+
tempDir, _ := os.UserCacheDir()
102+
tempDir = filepath.Join(tempDir, repoName)
103+
_ = os.MkdirAll(tempDir, os.ModePerm)
104+
105+
tempFile, err := os.OpenFile(filepath.Join(tempDir, fmt.Sprintf("%d.zip", time.Now().UnixMilli())), os.O_CREATE|os.O_WRONLY, 0644)
106+
if err != nil {
107+
return err
108+
}
109+
110+
//写入文件
111+
bar := progressbar.DefaultBytes(resp.ContentLength, "downloading")
112+
_, err = io.Copy(io.MultiWriter(tempFile, bar), resp.Body)
113+
if err != nil {
114+
return err
115+
}
116+
fmt.Printf("download completed\n")
117+
118+
//解压文件
119+
tempZip, _ := zip.OpenReader(tempFile.Name())
120+
defer func() {
121+
_ = tempZip.Close()
122+
_ = os.Remove(tempFile.Name())
123+
}()
124+
125+
//获取指定文件
126+
newFile, ok := lo.Find(tempZip.File, func(item *zip.File) bool {
127+
return strings.Contains(item.Name, repoName)
128+
})
129+
if !ok {
130+
return errors.New("not found install file from zip")
131+
}
132+
133+
newReader, _ := newFile.Open()
134+
newBytes, _ := io.ReadAll(newReader)
135+
136+
//获取真实安装路径
137+
exePath, _ := os.Executable()
138+
realPath, _ := filepath.EvalSymlinks(exePath)
139+
140+
//替换文件 覆盖
141+
return os.WriteFile(realPath, newBytes, os.ModePerm)
142+
}

go.mod

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,12 @@ require (
88
github.com/fsnotify/fsnotify v1.8.0 // indirect
99
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
1010
github.com/inconshreveable/mousetrap v1.1.0 // indirect
11+
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
1112
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
13+
github.com/rivo/uniseg v0.4.7 // indirect
1214
github.com/sagikazarmark/locafero v0.7.0 // indirect
1315
github.com/samber/do v1.6.0 // indirect
16+
github.com/schollz/progressbar/v3 v3.18.0 // indirect
1417
github.com/sourcegraph/conc v0.3.0 // indirect
1518
github.com/spf13/afero v1.12.0 // indirect
1619
github.com/spf13/cast v1.7.1 // indirect
@@ -21,6 +24,7 @@ require (
2124
go.uber.org/atomic v1.9.0 // indirect
2225
go.uber.org/multierr v1.9.0 // indirect
2326
golang.org/x/sys v0.29.0 // indirect
27+
golang.org/x/term v0.28.0 // indirect
2428
golang.org/x/text v0.21.0 // indirect
2529
gopkg.in/yaml.v3 v3.0.1 // indirect
2630
)

go.sum

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,13 @@ github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIx
77
github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
88
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
99
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
10+
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
11+
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
1012
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
1113
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
1214
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
15+
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
16+
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
1317
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
1418
github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo=
1519
github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k=
@@ -18,6 +22,8 @@ github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc=
1822
github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU=
1923
github.com/samber/lo v1.49.1 h1:4BIFyVfuQSEpluc7Fua+j1NolZHiEHEpaSEKdsH0tew=
2024
github.com/samber/lo v1.49.1/go.mod h1:dO6KHFzUKXgP8LDhU0oI8d2hekjXnGOu0DB8Jecxd6o=
25+
github.com/schollz/progressbar/v3 v3.18.0 h1:uXdoHABRFmNIjUfte/Ex7WtuyVslrw2wVPQmCN62HpA=
26+
github.com/schollz/progressbar/v3 v3.18.0/go.mod h1:IsO3lpbaGuzh8zIMzgY3+J8l4C8GjO0Y9S69eFvNsec=
2127
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
2228
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
2329
github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs=
@@ -40,6 +46,8 @@ go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
4046
go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
4147
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
4248
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
49+
golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
50+
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
4351
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
4452
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
4553
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

0 commit comments

Comments
 (0)