github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/release/github/releases.go (about) 1 // Modified from https://github.com/aktau/github-release/blob/master/releases.go 2 3 package github 4 5 import ( 6 "fmt" 7 "strings" 8 "time" 9 ) 10 11 const ( 12 releaseListPath = "/repos/%s/%s/releases" 13 releaseLatestPath = "/repos/%s/%s/releases/latest" 14 ) 15 16 // Release is a Github API Release type 17 type Release struct { 18 URL string `json:"url"` 19 PageURL string `json:"html_url"` 20 UploadURL string `json:"upload_url"` 21 ID int `json:"id"` 22 Name string `json:"name"` 23 Description string `json:"body"` 24 TagName string `json:"tag_name"` 25 Draft bool `json:"draft"` 26 Prerelease bool `json:"prerelease"` 27 Created *time.Time `json:"created_at"` 28 Published *time.Time `json:"published_at"` 29 Assets []Asset `json:"assets"` 30 } 31 32 // CleanUploadURL is URL for uploading a release 33 func (r *Release) CleanUploadURL() string { 34 bracket := strings.Index(r.UploadURL, "{") 35 36 if bracket == -1 { 37 return r.UploadURL 38 } 39 40 return r.UploadURL[0:bracket] 41 } 42 43 // ReleaseCreate is a Github API ReleaseCreate type 44 type ReleaseCreate struct { 45 TagName string `json:"tag_name"` 46 TargetCommitish string `json:"target_commitish,omitempty"` 47 Name string `json:"name"` 48 Body string `json:"body"` 49 Draft bool `json:"draft"` 50 Prerelease bool `json:"prerelease"` 51 } 52 53 // Releases returns releases for a repo 54 func Releases(user, repo, token string) (releases []Release, err error) { 55 u, err := githubURL(githubAPIURL) 56 if err != nil { 57 return nil, err 58 } 59 u.Path = fmt.Sprintf(releaseListPath, user, repo) 60 err = Get(token, u.String(), &releases) 61 if err != nil { 62 return 63 } 64 return 65 } 66 67 // LatestRelease returns latest release for repo 68 func LatestRelease(user, repo, token string) (release *Release, err error) { 69 u, err := githubURL(githubAPIURL) 70 if err != nil { 71 return 72 } 73 u.Path = fmt.Sprintf(releaseLatestPath, user, repo) 74 err = Get(token, u.String(), &release) 75 return 76 } 77 78 // ReleaseOfTag returns release for tag 79 func ReleaseOfTag(user, repo, tag, token string) (*Release, error) { 80 releases, err := Releases(user, repo, token) 81 if err != nil { 82 return nil, err 83 } 84 85 for _, release := range releases { 86 if release.TagName == tag { 87 return &release, nil 88 } 89 } 90 91 return nil, &ErrNotFound{Name: "release", Key: "tag", Value: tag} 92 }