From e7467b5018657e5992e362fefc7d211c89d8334d Mon Sep 17 00:00:00 2001 From: Matti R Date: Sun, 3 Oct 2021 15:00:40 -0400 Subject: [PATCH 01/15] Add simple update checker to Gitea --- custom/conf/app.example.ini | 17 +++++- .../doc/advanced/config-cheat-sheet.en-us.md | 11 +++- models/update_checker.go | 55 +++++++++++++++++++ modules/cron/tasks_extended.go | 20 +++++++ 4 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 models/update_checker.go diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index f8286a2e87549..1aae9c33a1227 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -1883,7 +1883,7 @@ PATH = ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;ENABLED = false ;RUN_AT_START = false -;NO_SUCCESS_NOTICE = f;alse +;NO_SUCCESS_NOTICE = false ;SCHEDULE = @every 72h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1907,7 +1907,7 @@ PATH = ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;ENABLED = false ;RUN_AT_START = false -;NO_SUCCESS_NOTICE = f;alse +;NO_SUCCESS_NOTICE = false ;SCHEDULE = @every 72h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1923,6 +1923,19 @@ PATH = ;SCHEDULE = @every 168h ;OLDER_THAN = 8760h +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Delete all old actions from database +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;[cron.delete_old_actions] +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;ENABLED = false +;RUN_AT_START = false +;NO_SUCCESS_NOTICE = false +;SCHEDULE = @every 168h +;HTTP_ENDPOINT = https://dl.gitea.io/gitea/version.json + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Git Operation timeout in seconds diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index d80f96b3de04b..b9189214851ae 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -24,7 +24,7 @@ typically be found at `/etc/gitea/conf/app.ini`. The defaults provided here are best-effort (not built automatically). They are accurately recorded in [app.example.ini](https://github.com/go-gitea/gitea/blob/master/custom/conf/app.example.ini) -(s/master/\). Any string in the format `%(X)s` is a feature powered +(s/main/\). Any string in the format `%(X)s` is a feature powered by [ini](https://github.com/go-ini/ini/#recursive-values), for reading values recursively. Values containing `#` or `;` must be quoted using `` ` `` or `"""`. @@ -824,9 +824,16 @@ NB: You must have `DISABLE_ROUTER_LOG` set to `false` for this option to take ef - `ENABLED`: **false**: Enable service. - `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED). - `NO_SUCCESS_NOTICE`: **false**: Set to true to switch off success notices. -- `SCHEDULE`: **@every 128h**: Cron syntax for scheduling a work, e.g. `@every 128h`. +- `SCHEDULE`: **@every 168h**: Cron syntax for scheduling a work, e.g. `@every 168h`. - `OLDER_THAN`: **@every 8760h**: any action older than this expression will be deleted from database, suggest using `8760h` (1 year) because that's the max length of heatmap. +#### Cron - Delete all old actions from database ('cron.update_checker') +- `ENABLED`: **false**: Enable service. +- `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED). +- `NO_SUCCESS_NOTICE`: **false**: Set to true to switch off success notices. +- `SCHEDULE`: **@every 168h**: Cron syntax for scheduling a work, e.g. `@every 168h`. +- `HTTP_ENDPOINT`: **https://dl.gitea.io/gitea/version.json**: the endpoint that Gitea will check for newer versions + ## Git (`git`) - `PATH`: **""**: The path of git executable. If empty, Gitea searches through the PATH environment. diff --git a/models/update_checker.go b/models/update_checker.go new file mode 100644 index 0000000000000..79077ea20c149 --- /dev/null +++ b/models/update_checker.go @@ -0,0 +1,55 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + + "code.gitea.io/gitea/modules/proxy" + "code.gitea.io/gitea/modules/setting" + + "github.com/hashicorp/go-version" +) + +// GiteaUpdateChecker returns error when new version of Gitea is available +func GiteaUpdateChecker(httpEndpoint string) error { + httpClient := &http.Client{ + Transport: &http.Transport{ + Proxy: proxy.Proxy(), + }, + } + + req, err := http.NewRequest("GET", httpEndpoint, nil) + if err != nil { + return err + } + resp, err := httpClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + type v struct { + Latest string `json:"latest"` + } + /* + expect something like: + {"latest":"1.15.3"} + */ + ver := v{} + err = json.Unmarshal(body, &ver) + if err != nil { + return err + } + giteaVersion, _ := version.NewVersion(setting.AppVer) + updateVersion, _ := version.NewVersion(ver.Latest) + if giteaVersion.LessThan(updateVersion) { + return fmt.Errorf("Newer version of Gitea available: %s Check the blog for more details https://blog.gitea.io", ver.Latest) + } + return nil +} diff --git a/modules/cron/tasks_extended.go b/modules/cron/tasks_extended.go index 680f83e50c87b..e73ca898c44d7 100644 --- a/modules/cron/tasks_extended.go +++ b/modules/cron/tasks_extended.go @@ -131,6 +131,25 @@ func registerDeleteOldActions() { }) } +func registerUpdateGiteaChecker() { + type UpdateCheckerConfig struct { + BaseConfig + Timeout time.Duration + HttpEndpoint string + } + RegisterTaskFatal("update_checker", &UpdateCheckerConfig{ + BaseConfig: BaseConfig{ + Enabled: false, + RunAtStart: false, + Schedule: "@every 168h", + }, + HttpEndpoint: "https://dl.gitea.io/gitea/version.json", + }, func(ctx context.Context, _ *models.User, config Config) error { + updateCheckerConfig := config.(*UpdateCheckerConfig) + return models.GiteaUpdateChecker(updateCheckerConfig.HttpEndpoint) + }) +} + func initExtendedTasks() { registerDeleteInactiveUsers() registerDeleteRepositoryArchives() @@ -142,4 +161,5 @@ func initExtendedTasks() { registerDeleteMissingRepositories() registerRemoveRandomAvatars() registerDeleteOldActions() + registerUpdateGiteaChecker() } From b73aa6ce01c1f5e263c9c1699e82e44a2141fb28 Mon Sep 17 00:00:00 2001 From: Matti R Date: Sun, 3 Oct 2021 15:26:45 -0400 Subject: [PATCH 02/15] update struct and remove comments --- models/update_checker.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/models/update_checker.go b/models/update_checker.go index 79077ea20c149..999d6feaf353d 100644 --- a/models/update_checker.go +++ b/models/update_checker.go @@ -34,22 +34,26 @@ func GiteaUpdateChecker(httpEndpoint string) error { } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + type v struct { - Latest string `json:"latest"` + Latest struct { + Version string `json:"version"` + } `json:"latest"` } - /* - expect something like: - {"latest":"1.15.3"} - */ ver := v{} err = json.Unmarshal(body, &ver) if err != nil { return err } + giteaVersion, _ := version.NewVersion(setting.AppVer) - updateVersion, _ := version.NewVersion(ver.Latest) + updateVersion, _ := version.NewVersion(ver.Latest.Version) if giteaVersion.LessThan(updateVersion) { - return fmt.Errorf("Newer version of Gitea available: %s Check the blog for more details https://blog.gitea.io", ver.Latest) + return fmt.Errorf("Newer version of Gitea available: %s Check the blog for more details https://blog.gitea.io", ver.Latest.Version) } + return nil } From b6ef89b6af3dae682baeba2340e96246349862c0 Mon Sep 17 00:00:00 2001 From: Matti R Date: Sun, 3 Oct 2021 15:29:14 -0400 Subject: [PATCH 03/15] fix lint --- modules/cron/tasks_extended.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/cron/tasks_extended.go b/modules/cron/tasks_extended.go index e73ca898c44d7..79e7f2ed80257 100644 --- a/modules/cron/tasks_extended.go +++ b/modules/cron/tasks_extended.go @@ -135,7 +135,7 @@ func registerUpdateGiteaChecker() { type UpdateCheckerConfig struct { BaseConfig Timeout time.Duration - HttpEndpoint string + HTTPEndpoint string } RegisterTaskFatal("update_checker", &UpdateCheckerConfig{ BaseConfig: BaseConfig{ @@ -143,10 +143,10 @@ func registerUpdateGiteaChecker() { RunAtStart: false, Schedule: "@every 168h", }, - HttpEndpoint: "https://dl.gitea.io/gitea/version.json", + HTTPEndpoint: "https://dl.gitea.io/gitea/version.json", }, func(ctx context.Context, _ *models.User, config Config) error { updateCheckerConfig := config.(*UpdateCheckerConfig) - return models.GiteaUpdateChecker(updateCheckerConfig.HttpEndpoint) + return models.GiteaUpdateChecker(updateCheckerConfig.HTTPEndpoint) }) } From 5d13cb5f7a2a88e40705a153335fb33d76cf5778 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Sun, 3 Oct 2021 17:54:46 -0400 Subject: [PATCH 04/15] Update custom/conf/app.example.ini --- custom/conf/app.example.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index 1aae9c33a1227..705c86cf21aae 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -1927,7 +1927,7 @@ PATH = ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Delete all old actions from database ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;[cron.delete_old_actions] +;[cron.update_checker] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;ENABLED = false From c1aa2fb0a79a3f44057e52151eb89881acf64802 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Sun, 3 Oct 2021 18:47:14 -0400 Subject: [PATCH 05/15] Update docs/content/doc/advanced/config-cheat-sheet.en-us.md Co-authored-by: delvh --- docs/content/doc/advanced/config-cheat-sheet.en-us.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index b9189214851ae..db2c4ef86bc93 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -824,7 +824,7 @@ NB: You must have `DISABLE_ROUTER_LOG` set to `false` for this option to take ef - `ENABLED`: **false**: Enable service. - `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED). - `NO_SUCCESS_NOTICE`: **false**: Set to true to switch off success notices. -- `SCHEDULE`: **@every 168h**: Cron syntax for scheduling a work, e.g. `@every 168h`. +- `SCHEDULE`: **@every 168h**: Cron syntax to set how often to check. - `OLDER_THAN`: **@every 8760h**: any action older than this expression will be deleted from database, suggest using `8760h` (1 year) because that's the max length of heatmap. #### Cron - Delete all old actions from database ('cron.update_checker') From 57dc076fab4efeb6501bc748f4aa1bb00f96becd Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Sun, 3 Oct 2021 18:51:10 -0400 Subject: [PATCH 06/15] Update custom/conf/app.example.ini Co-authored-by: delvh --- custom/conf/app.example.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index 705c86cf21aae..d712d54e1f100 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -1925,7 +1925,7 @@ PATH = ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Delete all old actions from database +;; Check for new Gitea versions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;[cron.update_checker] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; From 6df97475b610924cff8bcbb9608ba82f4d31f702 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Sun, 3 Oct 2021 18:51:15 -0400 Subject: [PATCH 07/15] Update docs/content/doc/advanced/config-cheat-sheet.en-us.md Co-authored-by: delvh --- docs/content/doc/advanced/config-cheat-sheet.en-us.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index db2c4ef86bc93..fb4fcf10d85d1 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -830,7 +830,7 @@ NB: You must have `DISABLE_ROUTER_LOG` set to `false` for this option to take ef #### Cron - Delete all old actions from database ('cron.update_checker') - `ENABLED`: **false**: Enable service. - `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED). -- `NO_SUCCESS_NOTICE`: **false**: Set to true to switch off success notices. +- `ENABLE_SUCCESS_NOTICE`: **true**: Set to false to switch off success notices. - `SCHEDULE`: **@every 168h**: Cron syntax for scheduling a work, e.g. `@every 168h`. - `HTTP_ENDPOINT`: **https://dl.gitea.io/gitea/version.json**: the endpoint that Gitea will check for newer versions From 28c36c7753c01456fd7983f9ad530f090dccad18 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Sun, 3 Oct 2021 18:52:01 -0400 Subject: [PATCH 08/15] Update docs/content/doc/advanced/config-cheat-sheet.en-us.md Co-authored-by: Steven <61625851+justusbunsi@users.noreply.github.com> --- docs/content/doc/advanced/config-cheat-sheet.en-us.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index fb4fcf10d85d1..2677fade24b1c 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -23,7 +23,7 @@ or any corresponding location. When installing from a distribution, this will typically be found at `/etc/gitea/conf/app.ini`. The defaults provided here are best-effort (not built automatically). They are -accurately recorded in [app.example.ini](https://github.com/go-gitea/gitea/blob/master/custom/conf/app.example.ini) +accurately recorded in [app.example.ini](https://github.com/go-gitea/gitea/blob/main/custom/conf/app.example.ini) (s/main/\). Any string in the format `%(X)s` is a feature powered by [ini](https://github.com/go-ini/ini/#recursive-values), for reading values recursively. From 2fcd728d76bf6821099b4d861693079c9a7e80c9 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Sun, 3 Oct 2021 18:53:11 -0400 Subject: [PATCH 09/15] Update docs/content/doc/advanced/config-cheat-sheet.en-us.md --- docs/content/doc/advanced/config-cheat-sheet.en-us.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index 2677fade24b1c..cc35b6b1169cd 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -827,7 +827,7 @@ NB: You must have `DISABLE_ROUTER_LOG` set to `false` for this option to take ef - `SCHEDULE`: **@every 168h**: Cron syntax to set how often to check. - `OLDER_THAN`: **@every 8760h**: any action older than this expression will be deleted from database, suggest using `8760h` (1 year) because that's the max length of heatmap. -#### Cron - Delete all old actions from database ('cron.update_checker') +#### Cron - Check for new Gitea versions ('cron.update_checker') - `ENABLED`: **false**: Enable service. - `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED). - `ENABLE_SUCCESS_NOTICE`: **true**: Set to false to switch off success notices. From e67c00660749f120eb2f4e461ff6abc5a1413fa9 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Mon, 4 Oct 2021 13:10:23 -0400 Subject: [PATCH 10/15] Update modules/cron/tasks_extended.go Co-authored-by: wxiaoguang --- modules/cron/tasks_extended.go | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/cron/tasks_extended.go b/modules/cron/tasks_extended.go index 79e7f2ed80257..364c611a79fb2 100644 --- a/modules/cron/tasks_extended.go +++ b/modules/cron/tasks_extended.go @@ -134,7 +134,6 @@ func registerDeleteOldActions() { func registerUpdateGiteaChecker() { type UpdateCheckerConfig struct { BaseConfig - Timeout time.Duration HTTPEndpoint string } RegisterTaskFatal("update_checker", &UpdateCheckerConfig{ From b89196784dfe180e2b77e581f39b4e21e6c8e29b Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Mon, 4 Oct 2021 13:11:06 -0400 Subject: [PATCH 11/15] Update custom/conf/app.example.ini Co-authored-by: wxiaoguang --- custom/conf/app.example.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index a0a2212d22dbe..d9880df883cdc 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -1932,7 +1932,7 @@ PATH = ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;ENABLED = false ;RUN_AT_START = false -;NO_SUCCESS_NOTICE = false +;ENABLE_SUCCESS_NOTICE = false ;SCHEDULE = @every 168h ;HTTP_ENDPOINT = https://dl.gitea.io/gitea/version.json From 4e80fb0a5841f4c54f8964558dbeb247c9a36d8b Mon Sep 17 00:00:00 2001 From: Matti R Date: Fri, 15 Oct 2021 13:18:45 -0400 Subject: [PATCH 12/15] take PR feedback into account and display banner on admin dashboard for alerts --- models/migrations/migrations.go | 2 + models/migrations/v199.go | 27 ++++++++++++ models/update_checker.go | 78 +++++++++++++++++++++++++++++++-- modules/cron/tasks_extended.go | 2 +- routers/web/admin/admin.go | 2 + templates/admin/dashboard.tmpl | 5 +++ 6 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 models/migrations/v199.go diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index ef0c071417653..3a41cf88918d3 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -350,6 +350,8 @@ var migrations = []Migration{ NewMigration("Add renamed_branch table", addRenamedBranchTable), // v198 -> v199 NewMigration("Add issue content history table", addTableIssueContentHistory), + // v199 -> v200 + NewMigration("Add remote version table", addRemoteVersionTable), } // GetCurrentDBVersion returns the current db version diff --git a/models/migrations/v199.go b/models/migrations/v199.go new file mode 100644 index 0000000000000..94301f4bea9b6 --- /dev/null +++ b/models/migrations/v199.go @@ -0,0 +1,27 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "fmt" + + "xorm.io/xorm" +) + +func addRemoteVersionTable(x *xorm.Engine) error { + type RemoteVersion struct { + ID int64 `xorm:"pk autoincr"` + Version string `xorm:"VARCHAR(50)"` + } + + if err := x.Sync2(new(RemoteVersion)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + + remoteVersion := new(RemoteVersion) + remoteVersion.Version = "0" + _, err := x.Insert(remoteVersion) + return err +} diff --git a/models/update_checker.go b/models/update_checker.go index 999d6feaf353d..2573495d4565d 100644 --- a/models/update_checker.go +++ b/models/update_checker.go @@ -10,12 +10,22 @@ import ( "io/ioutil" "net/http" + "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/proxy" "code.gitea.io/gitea/modules/setting" "github.com/hashicorp/go-version" ) +type RemoteVersion struct { + ID int64 `xorm:"pk autoincr"` + Version string `xorm:"VARCHAR(50)"` +} + +func init() { + db.RegisterModel(new(RemoteVersion)) +} + // GiteaUpdateChecker returns error when new version of Gitea is available func GiteaUpdateChecker(httpEndpoint string) error { httpClient := &http.Client{ @@ -49,11 +59,71 @@ func GiteaUpdateChecker(httpEndpoint string) error { return err } - giteaVersion, _ := version.NewVersion(setting.AppVer) - updateVersion, _ := version.NewVersion(ver.Latest.Version) + return UpdateRemoteVersion(ver.Latest.Version) + +} + +// UpdateRemoteVersion marks someone be another's follower. +func UpdateRemoteVersion(version string) (err error) { + sess := db.NewSession(db.DefaultContext) + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + currentVersion := &RemoteVersion{ID: 1} + has, err := sess.Get(currentVersion) + if err != nil { + return fmt.Errorf("get: %v", err) + } else if !has { + currentVersion.ID = 0 + currentVersion.Version = version + + if _, err = sess.InsertOne(currentVersion); err != nil { + return fmt.Errorf("insert: %v", err) + } + return nil + } + + if _, err = sess.Update(&RemoteVersion{ID: 1, Version: version}); err != nil { + return err + } + + return sess.Commit() +} + +func GetRemoteVersion() string { + e := db.GetEngine(db.DefaultContext) + v := &RemoteVersion{ID: 1} + _, err := e.Get(&v) + if err != nil { + // return 0 if fail to get fetch from DB, so it fails silently + return "0" + } + return v.Version +} +func GetNeedUpdate() bool { + e := db.GetEngine(db.DefaultContext) + v := &RemoteVersion{ID: 1} + _, err := e.Get(&v) + if err != nil { + // return false if fail to get fetch from DB, so it fails silently + return false + } + + giteaVersion, err := version.NewVersion(setting.AppVer) + if err != nil { + // return false to fail silently + return false + } + updateVersion, err := version.NewVersion(v.Version) + if err != nil { + // return false to fail silently + return false + } if giteaVersion.LessThan(updateVersion) { - return fmt.Errorf("Newer version of Gitea available: %s Check the blog for more details https://blog.gitea.io", ver.Latest.Version) + return true } - return nil + return false } diff --git a/modules/cron/tasks_extended.go b/modules/cron/tasks_extended.go index 364c611a79fb2..6645e71d2cb26 100644 --- a/modules/cron/tasks_extended.go +++ b/modules/cron/tasks_extended.go @@ -138,7 +138,7 @@ func registerUpdateGiteaChecker() { } RegisterTaskFatal("update_checker", &UpdateCheckerConfig{ BaseConfig: BaseConfig{ - Enabled: false, + Enabled: true, RunAtStart: false, Schedule: "@every 168h", }, diff --git a/routers/web/admin/admin.go b/routers/web/admin/admin.go index ce177ea090872..ca5b157523c50 100644 --- a/routers/web/admin/admin.go +++ b/routers/web/admin/admin.go @@ -125,6 +125,8 @@ func Dashboard(ctx *context.Context) { ctx.Data["PageIsAdmin"] = true ctx.Data["PageIsAdminDashboard"] = true ctx.Data["Stats"] = models.GetStatistic() + ctx.Data["NeedUpdate"] = models.GetNeedUpdate() + ctx.Data["RemoteVersion"] = models.GetRemoteVersion() // FIXME: update periodically updateSystemStatus() ctx.Data["SysStatus"] = sysStatus diff --git a/templates/admin/dashboard.tmpl b/templates/admin/dashboard.tmpl index de01f95eabd7b..0ace1003e3090 100644 --- a/templates/admin/dashboard.tmpl +++ b/templates/admin/dashboard.tmpl @@ -3,6 +3,11 @@ {{template "admin/navbar" .}}
{{template "base/alert" .}} + {{if .NeedUpdate}} +
+

{{.RemoteVersion | Str2html}}

+
+ {{end}}

{{.i18n.Tr "admin.dashboard.statistic"}}

From 0cfd1d8f4b3f3d58f4b5d706becd4fe5cd7b1704 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Fri, 15 Oct 2021 13:21:46 -0400 Subject: [PATCH 13/15] Add more detailed message --- templates/admin/dashboard.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/admin/dashboard.tmpl b/templates/admin/dashboard.tmpl index 0ace1003e3090..79f031882e332 100644 --- a/templates/admin/dashboard.tmpl +++ b/templates/admin/dashboard.tmpl @@ -5,7 +5,7 @@ {{template "base/alert" .}} {{if .NeedUpdate}}
-

{{.RemoteVersion | Str2html}}

+

"Gitea {{.RemoteVersion | Str2html}} is now available, you are running {{.AppVer | Str2html}}. Check the blog for more details.

{{end}}

From 13c631b3975b266f96f1673f99edae62761e990b Mon Sep 17 00:00:00 2001 From: Matti R Date: Fri, 15 Oct 2021 13:23:27 -0400 Subject: [PATCH 14/15] placate lint --- models/update_checker.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/models/update_checker.go b/models/update_checker.go index 2573495d4565d..3947ca66f5b67 100644 --- a/models/update_checker.go +++ b/models/update_checker.go @@ -17,6 +17,7 @@ import ( "github.com/hashicorp/go-version" ) +// RemoteVersion stores the remote version from the JSON endpoint type RemoteVersion struct { ID int64 `xorm:"pk autoincr"` Version string `xorm:"VARCHAR(50)"` @@ -92,6 +93,7 @@ func UpdateRemoteVersion(version string) (err error) { return sess.Commit() } +// GetRemoteVersion returns the current remote version func GetRemoteVersion() string { e := db.GetEngine(db.DefaultContext) v := &RemoteVersion{ID: 1} @@ -102,6 +104,8 @@ func GetRemoteVersion() string { } return v.Version } + +// GetNeedUpdate returns true if there is an update needed of Gitea func GetNeedUpdate() bool { e := db.GetEngine(db.DefaultContext) v := &RemoteVersion{ID: 1} From fc77ce3f5a5875104c5a4dcbe6af78713f7fad18 Mon Sep 17 00:00:00 2001 From: Matti R Date: Sat, 16 Oct 2021 00:36:13 -0400 Subject: [PATCH 15/15] update per feedback --- models/migrations/v199.go | 6 +----- models/update_checker.go | 30 +++++++++--------------------- 2 files changed, 10 insertions(+), 26 deletions(-) diff --git a/models/migrations/v199.go b/models/migrations/v199.go index 94301f4bea9b6..64b21172c103e 100644 --- a/models/migrations/v199.go +++ b/models/migrations/v199.go @@ -19,9 +19,5 @@ func addRemoteVersionTable(x *xorm.Engine) error { if err := x.Sync2(new(RemoteVersion)); err != nil { return fmt.Errorf("Sync2: %v", err) } - - remoteVersion := new(RemoteVersion) - remoteVersion.Version = "0" - _, err := x.Insert(remoteVersion) - return err + return nil } diff --git a/models/update_checker.go b/models/update_checker.go index 3947ca66f5b67..5b4fce69ece95 100644 --- a/models/update_checker.go +++ b/models/update_checker.go @@ -64,7 +64,7 @@ func GiteaUpdateChecker(httpEndpoint string) error { } -// UpdateRemoteVersion marks someone be another's follower. +// UpdateRemoteVersion updates the latest available version of Gitea func UpdateRemoteVersion(version string) (err error) { sess := db.NewSession(db.DefaultContext) defer sess.Close() @@ -77,7 +77,7 @@ func UpdateRemoteVersion(version string) (err error) { if err != nil { return fmt.Errorf("get: %v", err) } else if !has { - currentVersion.ID = 0 + currentVersion.ID = 1 currentVersion.Version = version if _, err = sess.InsertOne(currentVersion); err != nil { @@ -93,41 +93,29 @@ func UpdateRemoteVersion(version string) (err error) { return sess.Commit() } -// GetRemoteVersion returns the current remote version +// GetRemoteVersion returns the current remote version (or currently installed verson if fail to fetch from DB) func GetRemoteVersion() string { e := db.GetEngine(db.DefaultContext) v := &RemoteVersion{ID: 1} _, err := e.Get(&v) if err != nil { - // return 0 if fail to get fetch from DB, so it fails silently - return "0" + // return current version if fail to fetch from DB + return setting.AppVer } return v.Version } -// GetNeedUpdate returns true if there is an update needed of Gitea +// GetNeedUpdate returns true whether a newer version of Gitea is available func GetNeedUpdate() bool { - e := db.GetEngine(db.DefaultContext) - v := &RemoteVersion{ID: 1} - _, err := e.Get(&v) - if err != nil { - // return false if fail to get fetch from DB, so it fails silently - return false - } - - giteaVersion, err := version.NewVersion(setting.AppVer) + curVer, err := version.NewVersion(setting.AppVer) if err != nil { // return false to fail silently return false } - updateVersion, err := version.NewVersion(v.Version) + remoteVer, err := version.NewVersion(GetRemoteVersion()) if err != nil { // return false to fail silently return false } - if giteaVersion.LessThan(updateVersion) { - return true - } - - return false + return curVer.LessThan(remoteVer) }