forked from kataras/iris
-
Notifications
You must be signed in to change notification settings - Fork 0
/
version.go
151 lines (128 loc) · 4.2 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
package iris
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/url"
"os"
"os/exec"
"sync"
"time"
"github.com/kataras/golog"
"github.com/kataras/iris/core/netutil"
"github.com/kataras/survey"
"github.com/skratchdot/open-golang/open"
)
var checkVersionOnce = sync.Once{}
// CheckVersion checks for any available updates.
func CheckVersion() {
checkVersionOnce.Do(func() {
checkVersion()
})
}
type versionInfo struct {
Version string `json:"version"`
ChangelogURL string `json:"changelog_url"`
UpdateAvailable bool `json:"update_available"`
FirstTime bool `json:"first_time"`
}
func checkVersion() {
client := netutil.Client(25 * time.Second)
r, err := client.PostForm("https://iris-go.com/version", url.Values{"current_version": {Version}})
if err != nil {
golog.Debugf("%v", err)
return
}
defer r.Body.Close()
if r.StatusCode >= 400 {
return
}
b, err := ioutil.ReadAll(r.Body)
if len(b) == 0 || err != nil {
golog.Debugf("%v", err)
return
}
v := new(versionInfo)
if err := json.Unmarshal(b, v); err != nil {
golog.Debugf("error while unmarshal the response body: %v", err)
return
}
var qs []*survey.Question
// on help? when asking for installing the new update
// and when answering "No".
ignoreUpdatesMsg := "Would you like to ignore future updates? Disable the version checker via:\napp.Run(..., iris.WithoutVersionChecker)"
if v.UpdateAvailable {
// if update available ask for update action.
shouldUpdateNowMsg :=
fmt.Sprintf("A new version is available online[%s > %s].\nRelease notes: %s.\nUpdate now?",
v.Version, Version,
v.ChangelogURL)
qs = append(qs, &survey.Question{
Name: "shouldUpdateNow",
Prompt: &survey.Confirm{
Message: shouldUpdateNowMsg,
Help: ignoreUpdatesMsg,
},
Validate: survey.Required,
})
}
// firs time and update available is not relative because if no update often server will decide when to ask this,
// so separate the actions and if statements here.
if v.FirstTime {
// if first time that this server was updated then ask if enjoying the framework.
qs = append(qs, &survey.Question{
Name: "enjoyingIris",
Prompt: &survey.Confirm{
Message: "Enjoying Iris Framework?",
Help: "yes or no",
},
Validate: survey.Required,
})
}
// Ask if should update(if available) and enjoying iris(if first time) in the same survey.
ans := struct {
ShouldUpdateNow bool `survey:"shouldUpdateNow"`
EnjoyingIris bool `survey:"enjoyingIris"`
}{}
survey.Ask(qs, &ans)
if ans.EnjoyingIris {
// if the answer to the previous survey about enjoying the framework
// was positive then do the survey (currently only one question and its action).
qs2 := []*survey.Question{
{
Name: "starNow",
Prompt: &survey.Confirm{
Message: "Would you mind giving us a star on GitHub? It really helps us out! Thanks for your support:)",
Help: "Its free so let's do that, type 'y'",
},
Validate: survey.Required,
},
/* any future questions should be here, at this second survey. */
}
ans2 := struct {
StarNow bool `survey:"starNow"`
}{}
survey.Ask(qs2, &ans2)
if ans2.StarNow {
starRepo := "https://github.com/kataras/iris/stargazers"
if err := open.Run(starRepo); err != nil {
golog.Warnf("tried to open the browser for you but failed, please give us a star at: %s\n", starRepo)
}
}
}
// run the updater last, so the user can star the repo and at the same time
// the app will update her/his local iris.
if ans.ShouldUpdateNow { // it's true only when update was available and user typed "yes".
repo := "github.com/kataras/iris/..."
cmd := exec.Command("go", "get", "-u", "-v", repo)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stdout
if err := cmd.Run(); err != nil {
golog.Warnf("unexpected message while trying to go get,\nif you edited the original source code then you've to remove the whole $GOPATH/src/github.com/kataras folder and execute `go get -u github.com/kataras/iris/...` manually\n%v", err)
return
}
golog.Infof("Update process finished.\nManual rebuild and restart is required to apply the changes...\n")
} else if v.UpdateAvailable { // if update was available but choosen not to update.
golog.Infof(ignoreUpdatesMsg)
}
}