aboutsummaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
authortechknowlogick <techknowlogick@gitea.io>2021-10-16 02:14:34 -0400
committerGitHub <noreply@github.com>2021-10-16 02:14:34 -0400
commit8edda8b446200545b36432b57d00cd1972a5cb7e (patch)
tree2d4b6dd12a1f247d0e1b2459350b14e963f1b162 /models
parente18ea9e3491e872d0a0736322ace4def5680432c (diff)
downloadgitea-8edda8b446200545b36432b57d00cd1972a5cb7e.tar.gz
gitea-8edda8b446200545b36432b57d00cd1972a5cb7e.zip
Add simple update checker to Gitea (#17212)
* Add simple update checker to Gitea * update struct and remove comments * fix lint * Update custom/conf/app.example.ini * Update docs/content/doc/advanced/config-cheat-sheet.en-us.md Co-authored-by: delvh <dev.lh@web.de> * Update custom/conf/app.example.ini Co-authored-by: delvh <dev.lh@web.de> * Update docs/content/doc/advanced/config-cheat-sheet.en-us.md Co-authored-by: delvh <dev.lh@web.de> * Update docs/content/doc/advanced/config-cheat-sheet.en-us.md Co-authored-by: Steven <61625851+justusbunsi@users.noreply.github.com> * Update docs/content/doc/advanced/config-cheat-sheet.en-us.md * Update modules/cron/tasks_extended.go Co-authored-by: wxiaoguang <wxiaoguang@gmail.com> * Update custom/conf/app.example.ini Co-authored-by: wxiaoguang <wxiaoguang@gmail.com> * take PR feedback into account and display banner on admin dashboard for alerts * Add more detailed message * placate lint * update per feedback Co-authored-by: delvh <dev.lh@web.de> Co-authored-by: Steven <61625851+justusbunsi@users.noreply.github.com> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
Diffstat (limited to 'models')
-rw-r--r--models/migrations/migrations.go2
-rw-r--r--models/migrations/v199.go23
-rw-r--r--models/update_checker.go121
3 files changed, 146 insertions, 0 deletions
diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go
index ef0c071417..3a41cf8891 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 0000000000..64b21172c1
--- /dev/null
+++ b/models/migrations/v199.go
@@ -0,0 +1,23 @@
+// 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)
+ }
+ return nil
+}
diff --git a/models/update_checker.go b/models/update_checker.go
new file mode 100644
index 0000000000..5b4fce69ec
--- /dev/null
+++ b/models/update_checker.go
@@ -0,0 +1,121 @@
+// 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/models/db"
+ "code.gitea.io/gitea/modules/proxy"
+ "code.gitea.io/gitea/modules/setting"
+
+ "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)"`
+}
+
+func init() {
+ db.RegisterModel(new(RemoteVersion))
+}
+
+// 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)
+ if err != nil {
+ return err
+ }
+
+ type v struct {
+ Latest struct {
+ Version string `json:"version"`
+ } `json:"latest"`
+ }
+ ver := v{}
+ err = json.Unmarshal(body, &ver)
+ if err != nil {
+ return err
+ }
+
+ return UpdateRemoteVersion(ver.Latest.Version)
+
+}
+
+// UpdateRemoteVersion updates the latest available version of Gitea
+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 = 1
+ 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()
+}
+
+// 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 current version if fail to fetch from DB
+ return setting.AppVer
+ }
+ return v.Version
+}
+
+// GetNeedUpdate returns true whether a newer version of Gitea is available
+func GetNeedUpdate() bool {
+ curVer, err := version.NewVersion(setting.AppVer)
+ if err != nil {
+ // return false to fail silently
+ return false
+ }
+ remoteVer, err := version.NewVersion(GetRemoteVersion())
+ if err != nil {
+ // return false to fail silently
+ return false
+ }
+ return curVer.LessThan(remoteVer)
+}