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  }