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

Method fetchRequestedRelease

internal/registry/github/client.go:354–417  ·  view source on GitHub ↗
(ctx context.Context, repo repoSlug, version string)

Source from the content-addressed store, hash-verified

352}
353
354func (c *Client) fetchRequestedRelease(ctx context.Context, repo repoSlug, version string) (*release, error) {
355 if version == "" {
356 return c.fetchLatestRelease(ctx, repo)
357 }
358
359 endpoint := c.baseURL + "/repos/" + url.PathEscape(
360 repo.owner,
361 ) + "/" + url.PathEscape(
362 repo.name,
363 ) + "/releases/tags/" + url.PathEscape(
364 version,
365 )
366 response, err := c.doRequest(ctx, endpoint, acceptJSON)
367 if err != nil {
368 return nil, err
369 }
370 defer func() {
371 _ = response.Body.Close()
372 }()
373
374 switch response.StatusCode {
375 case http.StatusOK:
376 payload, err := io.ReadAll(response.Body)
377 closeErr := closeResponseBody(response.Body, fmt.Sprintf("release response for %q at %q", repo.full, version))
378 if err != nil {
379 return nil, joinErrors(
380 fmt.Errorf("github: read release %q for %q: %w", version, repo.full, err),
381 closeErr,
382 )
383 }
384 if closeErr != nil {
385 return nil, closeErr
386 }
387
388 var result release
389 if err := json.Unmarshal(payload, &result); err != nil {
390 return nil, fmt.Errorf("github: decode release %q for %q: %w", version, repo.full, err)
391 }
392 if result.Draft || result.Prerelease {
393 return nil, fmt.Errorf("github: release %q for %q is not a published full release", version, repo.full)
394 }
395 return &result, nil
396 case http.StatusUnauthorized:
397 closeErr := closeResponseBody(response.Body, fmt.Sprintf("release response for %q at %q", repo.full, version))
398 if closeErr != nil {
399 return nil, joinErrors(privateRepositoryError(repo.full), closeErr)
400 }
401 return nil, privateRepositoryError(repo.full)
402 case http.StatusNotFound:
403 if err := closeResponseBody(
404 response.Body,
405 fmt.Sprintf("release response for %q at %q", repo.full, version),
406 ); err != nil {
407 return nil, err
408 }
409 return nil, fmt.Errorf("github: release %q not found for repository %q", version, repo.full)
410 default:
411 err := responseError(response, "release lookup", repo.full)

Calls 7

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