-
Notifications
You must be signed in to change notification settings - Fork 531
/
version.go
205 lines (167 loc) · 4.88 KB
/
version.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
package version
import (
"bytes"
"context"
"fmt"
"os"
"path"
"runtime"
"runtime/debug"
"strings"
"text/tabwriter"
"github.com/blang/semver/v4"
"github.com/google/go-github/v48/github"
chainconfig "github.com/ignite/cli/v29/ignite/config/chain"
"github.com/ignite/cli/v29/ignite/pkg/cmdrunner/exec"
"github.com/ignite/cli/v29/ignite/pkg/cmdrunner/step"
"github.com/ignite/cli/v29/ignite/pkg/cosmosver"
"github.com/ignite/cli/v29/ignite/pkg/errors"
"github.com/ignite/cli/v29/ignite/pkg/gitpod"
"github.com/ignite/cli/v29/ignite/pkg/xexec"
)
const (
errOldCosmosSDKVersionStr = `Your chain has been scaffolded with an older version of Cosmos SDK: %s
Please, follow the migration guide to upgrade your chain to the latest version at https://docs.ignite.com/migration`
versionDev = "development"
versionNightly = "nightly"
)
// Version is the semantic version of Ignite CLI.
var Version = versionDev
// CheckNext checks whether there is a new version of Ignite CLI.
func CheckNext(ctx context.Context) (isAvailable bool, version string, err error) {
if Version == versionDev || Version == versionNightly {
return false, "", nil
}
tagName, err := getLatestReleaseTag(ctx)
if err != nil {
return false, "", err
}
currentVersion, err := semver.ParseTolerant(Version)
if err != nil {
return false, "", err
}
latestVersion, err := semver.ParseTolerant(tagName)
if err != nil {
return false, "", err
}
isAvailable = latestVersion.GT(currentVersion)
return isAvailable, tagName, nil
}
func getLatestReleaseTag(ctx context.Context) (string, error) {
latest, _, err := github.
NewClient(nil).
Repositories.
GetLatestRelease(ctx, "ignite", "cli")
if err != nil {
return "", err
}
if latest.TagName == nil {
return "", nil
}
return *latest.TagName, nil
}
// resolveDevVersion creates a string for version printing if the version being used is "development".
// the version will be of the form "LATEST-dev" where LATEST is the latest tagged release.
func resolveDevVersion(ctx context.Context) string {
// do nothing if built with specific tag
if Version != versionDev && Version != versionNightly {
return Version
}
tag, err := getLatestReleaseTag(ctx)
if err != nil {
return Version
}
// if the module version is higher than the latest tag, use the module version
if info, ok := debug.ReadBuildInfo(); ok {
if version := path.Base(info.Main.Path); version > tag {
tag = fmt.Sprintf("%s.0.0", version)
}
}
if Version == versionDev {
return tag + "-dev"
}
if Version == versionNightly {
return tag + "-nightly"
}
return Version
}
// Long generates a detailed version info.
func Long(ctx context.Context) string {
var (
w = &tabwriter.Writer{}
b = &bytes.Buffer{}
date = "undefined"
head = "undefined"
modified bool
sdkVersion = "undefined"
)
if info, ok := debug.ReadBuildInfo(); ok {
for _, dep := range info.Deps {
if cosmosver.CosmosSDKModulePathPattern.MatchString(dep.Path) {
sdkVersion = dep.Version
break
}
}
for _, kv := range info.Settings {
switch kv.Key {
case "vcs.revision":
head = kv.Value
case "vcs.time":
date = kv.Value
case "vcs.modified":
modified = kv.Value == "true"
}
}
if modified {
// add * suffix to head to indicate the sources have been modified.
head += "*"
}
}
write := func(k string, v interface{}) {
fmt.Fprintf(w, "%s:\t%v\n", k, v)
}
w.Init(b, 0, 8, 0, '\t', 0)
write("Ignite CLI version", resolveDevVersion(ctx))
write("Ignite CLI build date", date)
write("Ignite CLI source hash", head)
write("Ignite CLI config version", chainconfig.LatestVersion)
write("Cosmos SDK version", sdkVersion)
write("Your OS", runtime.GOOS)
write("Your arch", runtime.GOARCH)
cmdOut := &bytes.Buffer{}
nodeJSCmd := "node"
if xexec.IsCommandAvailable(nodeJSCmd) {
cmdOut.Reset()
err := exec.Exec(ctx, []string{nodeJSCmd, "-v"}, exec.StepOption(step.Stdout(cmdOut)))
if err == nil {
write("Your Node.js version", strings.TrimSpace(cmdOut.String()))
}
}
cmdOut.Reset()
err := exec.Exec(ctx, []string{"go", "version"}, exec.StepOption(step.Stdout(cmdOut)))
if err != nil {
panic(err)
}
write("Your go version", strings.TrimSpace(cmdOut.String()))
unameCmd := "uname"
if xexec.IsCommandAvailable(unameCmd) {
cmdOut.Reset()
err := exec.Exec(ctx, []string{unameCmd, "-a"}, exec.StepOption(step.Stdout(cmdOut)))
if err == nil {
write("Your uname -a", strings.TrimSpace(cmdOut.String()))
}
}
if cwd, err := os.Getwd(); err == nil {
write("Your cwd", cwd)
}
write("Is on Gitpod", gitpod.IsOnGitpod())
w.Flush()
return b.String()
}
// AssertSupportedCosmosSDKVersion asserts that a Cosmos SDK version is supported by Ignite CLI.
func AssertSupportedCosmosSDKVersion(v cosmosver.Version) error {
if v.LT(cosmosver.StargateFortySevenTwoVersion) {
return errors.Errorf(errOldCosmosSDKVersionStr, v)
}
return nil
}