| 458 | } |
| 459 | |
| 460 | func defaultWorkflowUpdateDeps() workflowUpdateDeps { |
| 461 | return workflowUpdateDeps{ |
| 462 | runReleasesAPI: func(ctx context.Context, repo string) ([]byte, error) { |
| 463 | endpoint := fmt.Sprintf("/repos/%s/releases", repo) |
| 464 | output, err := workflow.RunGHContext(ctx, "Fetching releases...", "api", endpoint, "--jq", ".[].tag_name") |
| 465 | if err != nil && gitutil.IsAuthError(err.Error()) { |
| 466 | updateLog.Printf("GitHub API auth failed for releases of %s, retrying without token", repo) |
| 467 | body, fallbackErr := fetchPublicGitHubAPI(ctx, endpoint) |
| 468 | if fallbackErr != nil { |
| 469 | return nil, fmt.Errorf("failed (with token: %w; without token: %w)", err, fallbackErr) |
| 470 | } |
| 471 | var releases []struct { |
| 472 | TagName string `json:"tag_name"` |
| 473 | } |
| 474 | if fallbackErr = json.Unmarshal(body, &releases); fallbackErr != nil { |
| 475 | return nil, fmt.Errorf("failed to parse releases response: %w", fallbackErr) |
| 476 | } |
| 477 | var tags []string |
| 478 | for _, r := range releases { |
| 479 | if r.TagName != "" { |
| 480 | tags = append(tags, r.TagName) |
| 481 | } |
| 482 | } |
| 483 | return []byte(strings.Join(tags, "\n")), nil |
| 484 | } |
| 485 | return output, err |
| 486 | }, |
| 487 | } |
| 488 | } |
| 489 | |
| 490 | // resolveLatestRelease resolves the latest compatible release for a workflow source |
| 491 | func resolveLatestRelease(ctx context.Context, repo, currentRef string, allowMajor, verbose bool, coolDown time.Duration) (string, error) { |