@@ -2,6 +2,7 @@ package extension
22
33import (
44 "encoding/json"
5+ "errors"
56 "fmt"
67 "io"
78 "io/ioutil"
@@ -80,6 +81,9 @@ func downloadAsset(httpClient *http.Client, asset releaseAsset, destPath string)
8081 return err
8182}
8283
84+ var releaseNotFoundErr = errors .New ("release not found" )
85+ var commitNotFoundErr = errors .New ("commit not found" )
86+
8387// fetchLatestRelease finds the latest published release for a repository.
8488func fetchLatestRelease (httpClient * http.Client , baseRepo ghrepo.Interface ) (* release , error ) {
8589 path := fmt .Sprintf ("repos/%s/%s/releases/latest" , baseRepo .RepoOwner (), baseRepo .RepoName ())
@@ -113,7 +117,7 @@ func fetchLatestRelease(httpClient *http.Client, baseRepo ghrepo.Interface) (*re
113117 return & r , nil
114118}
115119
116- // fetchRelease finds release by tag name for a repository
120+ // fetchReleaseFromTag finds release by tag name for a repository
117121func fetchReleaseFromTag (httpClient * http.Client , baseRepo ghrepo.Interface , tagName string ) (* release , error ) {
118122 fullRepoName := fmt .Sprintf ("%s/%s" , baseRepo .RepoOwner (), baseRepo .RepoName ())
119123 path := fmt .Sprintf ("repos/%s/releases/tags/%s" , fullRepoName , tagName )
@@ -129,6 +133,9 @@ func fetchReleaseFromTag(httpClient *http.Client, baseRepo ghrepo.Interface, tag
129133 return nil , err
130134 }
131135
136+ if resp .StatusCode == 404 {
137+ return nil , releaseNotFoundErr
138+ }
132139 if resp .StatusCode > 299 {
133140 return nil , api .HandleHTTPError (resp )
134141 }
@@ -146,3 +153,34 @@ func fetchReleaseFromTag(httpClient *http.Client, baseRepo ghrepo.Interface, tag
146153
147154 return & r , nil
148155}
156+
157+ // fetchCommitSHA finds full commit SHA from a target ref in a repo
158+ func fetchCommitSHA (httpClient * http.Client , baseRepo ghrepo.Interface , targetRef string ) (string , error ) {
159+ path := fmt .Sprintf ("repos/%s/%s/commits/%s" , baseRepo .RepoOwner (), baseRepo .RepoName (), targetRef )
160+ url := ghinstance .RESTPrefix (baseRepo .RepoHost ()) + path
161+ req , err := http .NewRequest ("GET" , url , nil )
162+ if err != nil {
163+ return "" , err
164+ }
165+
166+ req .Header .Set ("Accept" , "application/vnd.github.VERSION.sha" )
167+ resp , err := httpClient .Do (req )
168+ defer resp .Body .Close ()
169+ if err != nil {
170+ return "" , err
171+ }
172+
173+ if resp .StatusCode == 422 {
174+ return "" , commitNotFoundErr
175+ }
176+ if resp .StatusCode > 299 {
177+ return "" , api .HandleHTTPError (resp )
178+ }
179+
180+ body , err := ioutil .ReadAll (resp .Body )
181+ if err != nil {
182+ return "" , err
183+ }
184+
185+ return string (body ), nil
186+ }
0 commit comments