mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	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>
This commit is contained in:
		
							
								
								
									
										121
									
								
								models/update_checker.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								models/update_checker.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user