diff options
author | techknowlogick <techknowlogick@gitea.io> | 2021-10-16 02:14:34 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-16 02:14:34 -0400 |
commit | 8edda8b446200545b36432b57d00cd1972a5cb7e (patch) | |
tree | 2d4b6dd12a1f247d0e1b2459350b14e963f1b162 /models | |
parent | e18ea9e3491e872d0a0736322ace4def5680432c (diff) | |
download | gitea-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.go | 2 | ||||
-rw-r--r-- | models/migrations/v199.go | 23 | ||||
-rw-r--r-- | models/update_checker.go | 121 |
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) +} |