From e24d45f66a3982ee30e3ec833ce57a97e989a313 Mon Sep 17 00:00:00 2001 From: Gerasimos Maropoulos Date: Fri, 16 Sep 2016 21:16:48 +0300 Subject: [PATCH] Update to 4.2.5 --- HISTORY.md | 4 ++ README.md | 6 +-- iris.go | 155 ++++++++++++++++++++++++++++------------------------- 3 files changed, 88 insertions(+), 77 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index b7b71028..0a2958ce 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -2,6 +2,10 @@ **How to upgrade**: remove your `$GOPATH/src/github.com/kataras/iris` folder, open your command-line and execute this command: `go get -u github.com/kataras/iris`. +## 4.2.4 -> 4.2.5 + +- **ADDED**: `iris.CheckForUpdates(force bool)` which can run the updater(look 4.2.4) at runtime too, updater is tested and worked at dev machine. + ## 4.2.3 -> 4.2.4 - **NEW Experimental feature**: Updater with a `CheckForUpdates` [configuration](https://github.com/kataras/iris/blob/master/configuration.go) field, as requested [here](https://github.com/kataras/iris/issues/401) diff --git a/README.md b/README.md index dc182b76..3ca7728e 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@
-Releases +Releases Examples @@ -181,7 +181,7 @@ I recommend writing your API tests using this new library, [httpexpect](https:// Versioning ------------ -Current: **v4.2.4** +Current: **v4.2.5** > Iris is an active project @@ -224,7 +224,7 @@ License can be found [here](LICENSE). [Travis]: http://travis-ci.org/kataras/iris [License Widget]: https://img.shields.io/badge/license-Apache%202.0%20%20-E91E63.svg?style=flat-square [License]: https://github.com/kataras/iris/blob/master/LICENSE -[Release Widget]: https://img.shields.io/badge/release-v4.2.4-blue.svg?style=flat-square +[Release Widget]: https://img.shields.io/badge/release-v4.2.5-blue.svg?style=flat-square [Release]: https://github.com/kataras/iris/releases [Chat Widget]: https://img.shields.io/badge/community-chat-00BCD4.svg?style=flat-square [Chat]: https://kataras.rocket.chat/channel/iris diff --git a/iris.go b/iris.go index 0ceda4cc..6738d8a2 100644 --- a/iris.go +++ b/iris.go @@ -78,7 +78,7 @@ import ( const ( // Version is the current version of the Iris web framework - Version = "4.2.4" + Version = "4.2.5" banner = ` _____ _ |_ _| (_) @@ -136,8 +136,9 @@ type ( // FrameworkAPI contains the main Iris Public API FrameworkAPI interface { MuxAPI - Must(error) Set(...OptionSetter) + CheckForUpdates(bool) + Must(error) AddServer(...OptionServerSettter) *Server ListenTo(...OptionServerSettter) error Listen(string) @@ -242,77 +243,6 @@ func New(setters ...OptionSetter) *Framework { return s } -// Set sets an option aka configuration field to the default iris instance -func Set(setters ...OptionSetter) { - Default.Set(setters...) -} - -// Set sets an option aka configuration field to this iris instance -func (s *Framework) Set(setters ...OptionSetter) { - if s.Config == nil { - defaultConfiguration := DefaultConfiguration() - s.Config = &defaultConfiguration - } - - for _, setter := range setters { - setter.Set(s.Config) - } - - // because of the reason that an update can be executed while Iris is running, - // this is the only configuration field which is re-checked at runtime for that type of action. - // exists on initialize() also in order to cover the usage of: iris.Config.CheckForUpdates = true - s.checkForUpdates() -} - -func (s *Framework) checkForUpdates() { - // note: we could use the IsDevelopment configuration field to do that BUT - // the developer may want to check for updates without, for example, re-build template files (comes from IsDevelopment) on each request - if s.Config.CheckForUpdates { - if s.updateIris() { // if updated, then do not run the web server - exitWaitDuration := time.Duration(0) - if s.Logger != nil { - exitWaitDuration = 5 * time.Second - s.Logger.Println("exiting now...") - } - - time.AfterFunc(exitWaitDuration, func() { - os.Exit(0) - }) - } - } -} - -// global once because is not necessary to check for updates on more than one iris station* -var updateOnce sync.Once - -const ( - githubOwner = "kataras" - githubRepo = "iris" -) - -func (s *Framework) updateIris() bool { - updated := false - - updateOnce.Do(func() { - writer := s.Config.LoggerOut - - if writer == nil { - writer = os.Stdout // we need a writer because the update process will not be silent. - } - - fs.DefaultUpdaterAlreadyInstalledMessage = "INFO: Running with the latest version(%s)\n" - updater, err := fs.GetUpdater(githubOwner, githubRepo, Version) - - if err != nil { - writer.Write([]byte("Update failed: " + err.Error())) - } - - updated = updater.Run(fs.Stdout(writer), fs.Stderr(writer), fs.Silent(false)) - }) - - return updated -} - func (s *Framework) initialize() { // prepare the serializers, if not any other serializers setted for the default serializer types(json,jsonp,xml,markdown,text,data) then the defaults are setted: serializer.RegisterDefaults(s.serializers) @@ -356,7 +286,12 @@ func (s *Framework) initialize() { } // updates, to cover the default station's irs.Config.checkForUpdates - s.checkForUpdates() + // note: we could use the IsDevelopment configuration field to do that BUT + // the developer may want to check for updates without, for example, re-build template files (comes from IsDevelopment) on each request + if s.Config.CheckForUpdates { + s.CheckForUpdates(false) + } + } // Go starts the iris station, listens to all registered servers, and prepare only if Virtual @@ -412,6 +347,78 @@ func (s *Framework) Go() error { return nil } +// Set sets an option aka configuration field to the default iris instance +func Set(setters ...OptionSetter) { + Default.Set(setters...) +} + +// Set sets an option aka configuration field to this iris instance +func (s *Framework) Set(setters ...OptionSetter) { + if s.Config == nil { + defaultConfiguration := DefaultConfiguration() + s.Config = &defaultConfiguration + } + + for _, setter := range setters { + setter.Set(s.Config) + } +} + +// global once because is not necessary to check for updates on more than one iris station* +var updateOnce sync.Once + +const ( + githubOwner = "kataras" + githubRepo = "iris" +) + +// CheckForUpdates will try to search for newer version of Iris based on the https://github.com/kataras/iris/releases +// If a newer version found then the app will ask the he dev/user if want to update the 'x' version +// if 'y' is pressed then the updater will try to install the latest version +// the updater, will notify the dev/user that the update is finished and should restart the App manually. +func CheckForUpdates(force bool) { + Default.CheckForUpdates(force) +} + +// CheckForUpdates will try to search for newer version of Iris based on the https://github.com/kataras/iris/releases +// If a newer version found then the app will ask the he dev/user if want to update the 'x' version +// if 'y' is pressed then the updater will try to install the latest version +// the updater, will notify the dev/user that the update is finished and should restart the App manually. +// Note: exported func CheckForUpdates exists because of the reason that an update can be executed while Iris is running +func (s *Framework) CheckForUpdates(force bool) { + updated := false + checker := func() { + writer := s.Config.LoggerOut + + if writer == nil { + writer = os.Stdout // we need a writer because the update process will not be silent. + } + + fs.DefaultUpdaterAlreadyInstalledMessage = "INFO: Running with the latest version(%s)\n" + updater, err := fs.GetUpdater(githubOwner, githubRepo, Version) + + if err != nil { + writer.Write([]byte("Update failed: " + err.Error())) + } + + updated = updater.Run(fs.Stdout(writer), fs.Stderr(writer), fs.Silent(false)) + } + + if force { + checker() + } else { + updateOnce.Do(checker) + } + + if updated { // if updated, then do not run the web server + if s.Logger != nil { + s.Logger.Println("exiting now...") + } + os.Exit(0) + } + +} + // Must panics on error, it panics on registed iris' logger func Must(err error) { Default.Must(err)