code.gitea.io/gitea@v1.19.3/modules/updatechecker/update_checker.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package updatechecker 5 6 import ( 7 "io" 8 "net/http" 9 10 "code.gitea.io/gitea/modules/json" 11 "code.gitea.io/gitea/modules/proxy" 12 "code.gitea.io/gitea/modules/setting" 13 "code.gitea.io/gitea/modules/system" 14 15 "github.com/hashicorp/go-version" 16 ) 17 18 // CheckerState stores the remote version from the JSON endpoint 19 type CheckerState struct { 20 LatestVersion string 21 } 22 23 // Name returns the name of the state item for update checker 24 func (r *CheckerState) Name() string { 25 return "update-checker" 26 } 27 28 // GiteaUpdateChecker returns error when new version of Gitea is available 29 func GiteaUpdateChecker(httpEndpoint string) error { 30 httpClient := &http.Client{ 31 Transport: &http.Transport{ 32 Proxy: proxy.Proxy(), 33 }, 34 } 35 36 req, err := http.NewRequest("GET", httpEndpoint, nil) 37 if err != nil { 38 return err 39 } 40 resp, err := httpClient.Do(req) 41 if err != nil { 42 return err 43 } 44 defer resp.Body.Close() 45 body, err := io.ReadAll(resp.Body) 46 if err != nil { 47 return err 48 } 49 50 type respType struct { 51 Latest struct { 52 Version string `json:"version"` 53 } `json:"latest"` 54 } 55 respData := respType{} 56 err = json.Unmarshal(body, &respData) 57 if err != nil { 58 return err 59 } 60 61 return UpdateRemoteVersion(respData.Latest.Version) 62 } 63 64 // UpdateRemoteVersion updates the latest available version of Gitea 65 func UpdateRemoteVersion(version string) (err error) { 66 return system.AppState.Set(&CheckerState{LatestVersion: version}) 67 } 68 69 // GetRemoteVersion returns the current remote version (or currently installed version if fail to fetch from DB) 70 func GetRemoteVersion() string { 71 item := new(CheckerState) 72 if err := system.AppState.Get(item); err != nil { 73 return "" 74 } 75 return item.LatestVersion 76 } 77 78 // GetNeedUpdate returns true whether a newer version of Gitea is available 79 func GetNeedUpdate() bool { 80 curVer, err := version.NewVersion(setting.AppVer) 81 if err != nil { 82 // return false to fail silently 83 return false 84 } 85 remoteVerStr := GetRemoteVersion() 86 if remoteVerStr == "" { 87 // no remote version is known 88 return false 89 } 90 remoteVer, err := version.NewVersion(remoteVerStr) 91 if err != nil { 92 // return false to fail silently 93 return false 94 } 95 return curVer.LessThan(remoteVer) 96 }