2017-11-02 04:54:33 +01:00
package maintenance
import (
"fmt"
"os"
"os/exec"
"github.com/kataras/iris/core/maintenance/version"
"github.com/kataras/golog"
"github.com/kataras/survey"
)
const (
// Version is the string representation of the current local Iris Web Framework version.
2018-06-05 00:24:35 +02:00
Version = "10.6.6"
2017-11-02 04:54:33 +01:00
)
// CheckForUpdates checks for any available updates
// and asks for the user if want to update now or not.
2018-03-27 08:59:29 +02:00
func CheckForUpdates ( ) {
2017-11-02 04:54:33 +01:00
v := version . Acquire ( )
updateAvailale := v . Compare ( Version ) == version . Smaller
if updateAvailale {
2017-11-04 01:59:21 +01:00
if confirmUpdate ( v ) {
2018-02-12 05:03:15 +01:00
installVersion ( )
return
2017-11-02 04:54:33 +01:00
}
}
}
2017-11-04 01:59:21 +01:00
func confirmUpdate ( v version . Version ) bool {
2018-02-12 05:03:15 +01:00
// on help? when asking for installing the new update.
2017-11-02 04:54:33 +01:00
ignoreUpdatesMsg := "Would you like to ignore future updates? Disable the version checker via:\napp.Run(..., iris.WithoutVersionChecker)"
// if update available ask for update action.
shouldUpdateNowMsg :=
2018-02-12 05:03:15 +01:00
fmt . Sprintf ( "A new version is available online[%s > %s]. Type '?' for help.\nRelease notes: %s.\nUpdate now?" ,
v . String ( ) , Version , v . ChangelogURL )
2017-11-02 04:54:33 +01:00
var confirmUpdate bool
survey . AskOne ( & survey . Confirm {
Message : shouldUpdateNowMsg ,
Help : ignoreUpdatesMsg ,
} , & confirmUpdate , nil )
2017-11-04 01:59:21 +01:00
return confirmUpdate // it's true only when update was available and user typed "yes".
}
2017-11-02 04:54:33 +01:00
2017-11-04 01:59:21 +01:00
func installVersion ( ) {
golog . Infof ( "Downloading...\n" )
repo := "github.com/kataras/iris/..."
cmd := exec . Command ( "go" , "get" , "-u" , "-v" , repo )
cmd . Stdout = os . Stdout
cmd . Stderr = os . Stdout
2017-11-02 04:54:33 +01:00
2017-11-04 01:59:21 +01:00
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 )
2017-11-02 04:54:33 +01:00
return
}
2017-11-04 01:59:21 +01:00
golog . Infof ( "Update process finished.\nManual rebuild and restart is required to apply the changes...\n" )
return
2017-11-02 04:54:33 +01:00
}
/ * Author ' s note :
We could use github webhooks to automatic notify for updates
when a new update is pushed to the repository
even when server is already started and running but this would expose
a route which dev may don ' t know about , so let it for now but if
they ask it then I should add an optional configuration field
to "live/realtime update" and implement the idea ( which is already implemented in the iris - go server ) .
* /
/ * Author ' s note :
The old remote endpoint for version checker is still available on the server for backwards
compatibility with older clients , it will stay there for a long period of time .
* /