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 }