MCPcopy Create free account
hub / github.com/compozy/agh / fetchLatestRelease

Method fetchLatestRelease

internal/registry/github/client.go:287–352  ·  view source on GitHub ↗
(ctx context.Context, repo repoSlug)

Source from the content-addressed store, hash-verified

285}
286
287func (c *Client) fetchLatestRelease(ctx context.Context, repo repoSlug) (*release, error) {
288 endpoint := c.baseURL + "/repos/" + url.PathEscape(
289 repo.owner,
290 ) + "/" + url.PathEscape(
291 repo.name,
292 ) + "/releases/latest"
293 response, err := c.doRequest(ctx, endpoint, acceptJSON)
294 if err != nil {
295 return nil, err
296 }
297 defer func() {
298 _ = response.Body.Close()
299 }()
300
301 switch response.StatusCode {
302 case http.StatusOK:
303 payload, err := io.ReadAll(response.Body)
304 closeErr := closeResponseBody(response.Body, fmt.Sprintf("latest release response for %q", repo.full))
305 if err != nil {
306 return nil, joinErrors(
307 fmt.Errorf("github: read latest release for %q: %w", repo.full, err),
308 closeErr,
309 )
310 }
311 if closeErr != nil {
312 return nil, closeErr
313 }
314
315 var latest release
316 if err := json.Unmarshal(payload, &latest); err != nil {
317 return nil, fmt.Errorf("github: decode latest release for %q: %w", repo.full, err)
318 }
319 return &latest, nil
320 case http.StatusUnauthorized:
321 closeErr := closeResponseBody(
322 response.Body,
323 fmt.Sprintf("latest release response for %q", repo.full),
324 )
325 if closeErr != nil {
326 return nil, joinErrors(privateRepositoryError(repo.full), closeErr)
327 }
328 return nil, privateRepositoryError(repo.full)
329 case http.StatusNotFound:
330 if err := closeResponseBody(
331 response.Body,
332 fmt.Sprintf("latest release response for %q", repo.full),
333 ); err != nil {
334 return nil, err
335 }
336 releases, listErr := c.fetchReleasePage(ctx, repo)
337 if listErr != nil {
338 return nil, listErr
339 }
340 if len(releases) == 0 {
341 return nil, fmt.Errorf("github: repository %q has no published releases", repo.full)
342 }
343 latest := releases[0]
344 return &latest, nil

Calls 7

doRequestMethod · 0.95
fetchReleasePageMethod · 0.95
closeResponseBodyFunction · 0.85
privateRepositoryErrorFunction · 0.85
joinErrorsFunction · 0.70
responseErrorFunction · 0.70
CloseMethod · 0.65