MCPcopy Create free account
hub / github.com/ddev/ddev / GetGitHubRelease

Function GetGitHubRelease

pkg/github/github.go:53–105  ·  view source on GitHub ↗

GetGitHubRelease gets the tarball URL and version for a GitHub repository release

(owner, repo, requestedVersion string)

Source from the content-addressed store, hash-verified

51
52// GetGitHubRelease gets the tarball URL and version for a GitHub repository release
53func GetGitHubRelease(owner, repo, requestedVersion string) (tarballURL, downloadedRelease string, err error) {
54 ctx, client := GetGitHubClient(true)
55
56 releases, resp, err := client.Repositories.ListReleases(ctx, owner, repo, &ListOptions{PerPage: 100})
57 var tokenErr error
58 if err != nil {
59 if tokenErr = HasInvalidGitHubToken(resp); tokenErr != nil {
60 ctx, client = GetGitHubClient(false)
61 releasesNoAuth, respNoAuth, errNoAuth := client.Repositories.ListReleases(ctx, owner, repo, &ListOptions{PerPage: 100})
62 if errNoAuth == nil {
63 releases = releasesNoAuth
64 resp = respNoAuth
65 err = errNoAuth
66 }
67 }
68 }
69 if err != nil {
70 errorDetail := ""
71 if resp != nil {
72 rate := resp.Rate
73 if rate.Limit != 0 {
74 resetIn := time.Until(rate.Reset.Time).Round(time.Second)
75 errorDetail += fmt.Sprintf("\nGitHub API Rate Limit: %d/%d remaining (resets in %s)", rate.Remaining, rate.Limit, resetIn)
76 }
77 if tokenErr != nil {
78 errorDetail += "\nError: " + tokenErr.Error()
79 }
80 }
81 return "", "", fmt.Errorf("unable to get releases for %v: %w%s", repo, err, errorDetail)
82 }
83 if len(releases) == 0 {
84 return "", "", fmt.Errorf("no releases found for %v", repo)
85 }
86
87 releaseItem := 0
88 releaseFound := false
89 if requestedVersion != "" {
90 for i, release := range releases {
91 if release.GetTagName() == requestedVersion {
92 releaseItem = i
93 releaseFound = true
94 break
95 }
96 }
97 if !releaseFound {
98 return "", "", fmt.Errorf("no release found for %v with tag %v", repo, requestedVersion)
99 }
100 }
101
102 tarballURL = releases[releaseItem].GetTarballURL()
103 downloadedRelease = releases[releaseItem].GetTagName()
104 return tarballURL, downloadedRelease, nil
105}
106
107// GetGitHubHeaders returns headers to be used in GitHub REST API requests if the URL is for GitHub.
108// See https://docs.github.com/en/rest/authentication/authenticating-to-the-rest-api

Callers 2

GetAddonTarballURLFunction · 0.92
TestGetGitHubReleaseFunction · 0.92

Calls 4

GetGitHubClientFunction · 0.85
HasInvalidGitHubTokenFunction · 0.85
ErrorMethod · 0.80
ErrorfMethod · 0.80

Tested by 1

TestGetGitHubReleaseFunction · 0.74