nolint:revive // Allow dryRun control flag.
(ctx context.Context, inv *serpent.Invocation, version string)
| 167 | |
| 168 | //nolint:revive // Allow dryRun control flag. |
| 169 | func (r *releaseCommand) promoteVersionToStable(ctx context.Context, inv *serpent.Invocation, version string) error { |
| 170 | client := github.NewClient(nil) |
| 171 | if r.ghToken != "" { |
| 172 | client = client.WithAuthToken(r.ghToken) |
| 173 | } |
| 174 | |
| 175 | logger := r.logger.With(slog.F("version", version)) |
| 176 | |
| 177 | logger.Info(ctx, "checking current stable release") |
| 178 | |
| 179 | // Check if the version is already the latest stable release. |
| 180 | currentStable, _, err := client.Repositories.GetLatestRelease(ctx, "coder", "coder") |
| 181 | if err != nil { |
| 182 | return xerrors.Errorf("get latest release failed: %w", err) |
| 183 | } |
| 184 | |
| 185 | logger = logger.With(slog.F("stable_version", currentStable.GetTagName())) |
| 186 | logger.Info(ctx, "found current stable release") |
| 187 | |
| 188 | if currentStable.GetTagName() == version { |
| 189 | return xerrors.Errorf("version %q is already the latest stable release", version) |
| 190 | } |
| 191 | |
| 192 | // Ensure the version is a valid release. |
| 193 | perPage := 20 |
| 194 | latestReleases, _, err := client.Repositories.ListReleases(ctx, owner, repo, &github.ListOptions{ |
| 195 | Page: 0, |
| 196 | PerPage: perPage, |
| 197 | }) |
| 198 | if err != nil { |
| 199 | return xerrors.Errorf("list releases failed: %w", err) |
| 200 | } |
| 201 | |
| 202 | var releaseVersions []string |
| 203 | var newStable *github.RepositoryRelease |
| 204 | for _, r := range latestReleases { |
| 205 | releaseVersions = append(releaseVersions, r.GetTagName()) |
| 206 | if r.GetTagName() == version { |
| 207 | newStable = r |
| 208 | } |
| 209 | } |
| 210 | semver.Sort(releaseVersions) |
| 211 | slices.Reverse(releaseVersions) |
| 212 | |
| 213 | switch { |
| 214 | case len(releaseVersions) == 0: |
| 215 | return xerrors.Errorf("no releases found") |
| 216 | case newStable == nil: |
| 217 | return xerrors.Errorf("version %q is not found in the last %d releases", version, perPage) |
| 218 | } |
| 219 | |
| 220 | logger = logger.With(slog.F("mainline_version", releaseVersions[0])) |
| 221 | |
| 222 | if version != releaseVersions[0] { |
| 223 | logger.Warn(ctx, "selected version is not the latest mainline release") |
| 224 | } |
| 225 | |
| 226 | if reply, err := cliui.Prompt(inv, cliui.PromptOptions{ |
no test coverage detected