22// Use of this source code is governed by a MIT-style
33// license that can be found in the LICENSE file.
44
5- package models
5+ package updatechecker
66
77import (
88 "encoding/json"
9- "fmt"
109 "io/ioutil"
1110 "net/http"
1211
13- "code.gitea.io/gitea/models/db "
12+ "code.gitea.io/gitea/modules/appstate "
1413 "code.gitea.io/gitea/modules/proxy"
1514 "code.gitea.io/gitea/modules/setting"
1615
1716 "github.com/hashicorp/go-version"
1817)
1918
20- // RemoteVersion stores the remote version from the JSON endpoint
21- type RemoteVersion struct {
22- ID int64 `xorm:"pk autoincr"`
23- Version string `xorm:"VARCHAR(50)"`
19+ // CheckerState stores the remote version from the JSON endpoint
20+ type CheckerState struct {
21+ LatestVersion string
2422}
2523
26- func init () {
27- db .RegisterModel (new (RemoteVersion ))
24+ // Name returns the name of the state item for update checker
25+ func (r * CheckerState ) Name () string {
26+ return "update-checker"
2827}
2928
3029// GiteaUpdateChecker returns error when new version of Gitea is available
@@ -49,60 +48,33 @@ func GiteaUpdateChecker(httpEndpoint string) error {
4948 return err
5049 }
5150
52- type v struct {
51+ type respType struct {
5352 Latest struct {
5453 Version string `json:"version"`
5554 } `json:"latest"`
5655 }
57- ver := v {}
58- err = json .Unmarshal (body , & ver )
56+ respData := respType {}
57+ err = json .Unmarshal (body , & respData )
5958 if err != nil {
6059 return err
6160 }
6261
63- return UpdateRemoteVersion (ver .Latest .Version )
62+ return UpdateRemoteVersion (respData .Latest .Version )
6463
6564}
6665
6766// UpdateRemoteVersion updates the latest available version of Gitea
6867func UpdateRemoteVersion (version string ) (err error ) {
69- sess := db .NewSession (db .DefaultContext )
70- defer sess .Close ()
71- if err = sess .Begin (); err != nil {
72- return err
73- }
74-
75- currentVersion := & RemoteVersion {ID : 1 }
76- has , err := sess .Get (currentVersion )
77- if err != nil {
78- return fmt .Errorf ("get: %v" , err )
79- } else if ! has {
80- currentVersion .ID = 1
81- currentVersion .Version = version
82-
83- if _ , err = sess .InsertOne (currentVersion ); err != nil {
84- return fmt .Errorf ("insert: %v" , err )
85- }
86- return nil
87- }
88-
89- if _ , err = sess .Update (& RemoteVersion {ID : 1 , Version : version }); err != nil {
90- return err
91- }
92-
93- return sess .Commit ()
68+ return appstate .AppState .Set (& CheckerState {LatestVersion : version })
9469}
9570
9671// GetRemoteVersion returns the current remote version (or currently installed verson if fail to fetch from DB)
9772func GetRemoteVersion () string {
98- e := db .GetEngine (db .DefaultContext )
99- v := & RemoteVersion {ID : 1 }
100- _ , err := e .Get (& v )
101- if err != nil {
102- // return current version if fail to fetch from DB
103- return setting .AppVer
73+ item := new (CheckerState )
74+ if err := appstate .AppState .Get (item ); err != nil {
75+ return ""
10476 }
105- return v . Version
77+ return item . LatestVersion
10678}
10779
10880// GetNeedUpdate returns true whether a newer version of Gitea is available
@@ -112,7 +84,12 @@ func GetNeedUpdate() bool {
11284 // return false to fail silently
11385 return false
11486 }
115- remoteVer , err := version .NewVersion (GetRemoteVersion ())
87+ remoteVerStr := GetRemoteVersion ()
88+ if remoteVerStr == "" {
89+ // no remote version is known
90+ return false
91+ }
92+ remoteVer , err := version .NewVersion (remoteVerStr )
11693 if err != nil {
11794 // return false to fail silently
11895 return false
0 commit comments