pkg.re/essentialkaos/ek.10@v12.41.0+incompatible/usage/update/github.go (about)

     1  // Package update contains update checkers for different services
     2  package update
     3  
     4  // ////////////////////////////////////////////////////////////////////////////////// //
     5  //                                                                                    //
     6  //                         Copyright (c) 2022 ESSENTIAL KAOS                          //
     7  //      Apache License, Version 2.0 <https://www.apache.org/licenses/LICENSE-2.0>     //
     8  //                                                                                    //
     9  // ////////////////////////////////////////////////////////////////////////////////// //
    10  
    11  import (
    12  	"strings"
    13  	"time"
    14  
    15  	"pkg.re/essentialkaos/ek.v12/req"
    16  )
    17  
    18  // ////////////////////////////////////////////////////////////////////////////////// //
    19  
    20  type githubRelease struct {
    21  	Tag       string    `json:"tag_name"`
    22  	Published time.Time `json:"published_at"`
    23  }
    24  
    25  // ////////////////////////////////////////////////////////////////////////////////// //
    26  
    27  var githubAPI = "https://api.github.com"
    28  
    29  // ////////////////////////////////////////////////////////////////////////////////// //
    30  
    31  // GitHubChecker checks new releases on GitHub
    32  func GitHubChecker(app, version, data string) (string, time.Time, bool) {
    33  	if version == "" || data == "" || !isUpdateCheckRequired() {
    34  		return "", time.Time{}, false
    35  	}
    36  
    37  	release := getLatestGitHubRelease(app, version, data)
    38  
    39  	if release == nil {
    40  		return "", time.Time{}, false
    41  	}
    42  
    43  	return strings.TrimLeft(release.Tag, "v"), release.Published, true
    44  }
    45  
    46  // ////////////////////////////////////////////////////////////////////////////////// //
    47  
    48  // getLatestRelease fetches the latest release from GitHub
    49  func getLatestGitHubRelease(app, version, repository string) *githubRelease {
    50  	engine := req.Engine{}
    51  
    52  	engine.SetDialTimeout(3)
    53  	engine.SetRequestTimeout(3)
    54  	engine.SetUserAgent(app, version, "go.ek")
    55  
    56  	response, err := engine.Get(req.Request{
    57  		URL:         githubAPI + "/repos/" + repository + "/releases/latest",
    58  		AutoDiscard: true,
    59  	})
    60  
    61  	if err != nil || response.StatusCode != 200 {
    62  		return nil
    63  	}
    64  
    65  	if response.Header.Get("X-RateLimit-Remaining") == "0" {
    66  		return nil
    67  	}
    68  
    69  	release := &githubRelease{}
    70  	err = response.JSON(release)
    71  
    72  	if err != nil {
    73  		return nil
    74  	}
    75  
    76  	return release
    77  }