Skip to content

Commit 76345a6

Browse files
Copilotpelikhan
andauthored
Use semver-based selection and add repo context to error in resolveLatestRelease
Agent-Logs-Url: https://github.com/github/gh-aw/sessions/99b19872-48e9-42c7-a1b6-2798045efd66 Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
1 parent 55bd232 commit 76345a6

2 files changed

Lines changed: 24 additions & 10 deletions

File tree

pkg/cli/update_workflows.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -305,18 +305,31 @@ func resolveLatestRelease(repo, currentRef string, allowMajor, verbose bool) (st
305305
// Parse current version
306306
currentVer := parseVersion(currentRef)
307307
if currentVer == nil {
308-
// If current version is not a valid semantic version, return the latest stable release
308+
// If current version is not a valid semantic version, select the latest stable release
309+
// by semantic version so we are not sensitive to the ordering of the API response.
310+
var latestStable string
311+
var latestStableVersion *semverutil.SemanticVersion
312+
309313
for _, release := range releases {
310314
releaseVer := parseVersion(release)
311315
if releaseVer == nil || releaseVer.Pre != "" {
312316
continue
313317
}
314-
if verbose {
315-
fmt.Fprintln(os.Stderr, console.FormatInfoMessage("Current version is not valid, using latest release: "+release))
318+
if latestStableVersion == nil || releaseVer.IsNewer(latestStableVersion) {
319+
latestStable = release
320+
latestStableVersion = releaseVer
316321
}
317-
return release, nil
318322
}
319-
return "", errors.New("no stable releases found")
323+
324+
if latestStable == "" {
325+
return "", fmt.Errorf("no stable releases found for %s", repo)
326+
}
327+
328+
if verbose {
329+
fmt.Fprintln(os.Stderr, console.FormatInfoMessage("Current version is not valid, using latest stable release: "+latestStable))
330+
}
331+
332+
return latestStable, nil
320333
}
321334

322335
// Find the latest compatible non-prerelease release.

pkg/cli/update_workflows_test.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,18 @@ func TestResolveLatestRelease_PrereleaseTagsSkipped(t *testing.T) {
3232
}
3333

3434
// TestResolveLatestRelease_PrereleaseSkippedWhenCurrentVersionInvalid verifies that when
35-
// the current version is not a valid semantic version, the first stable (non-prerelease)
36-
// release is returned rather than the first item in the list which could be a prerelease.
35+
// the current version is not a valid semantic version, the highest stable release by
36+
// semver is returned rather than the first item in the list (which could be a prerelease
37+
// or an older release listed first by the API).
3738
func TestResolveLatestRelease_PrereleaseSkippedWhenCurrentVersionInvalid(t *testing.T) {
3839
mockWorkflowReleasesAPI(t, func(_ string) ([]byte, error) {
39-
// Prerelease appears first in the list returned by the API.
40-
return []byte("v2.0.0-rc.1\nv1.5.0"), nil
40+
// Prerelease appears first, and older stable release appears before newer one.
41+
return []byte("v2.0.0-rc.1\nv1.3.0\nv1.5.0"), nil
4142
})
4243

4344
result, err := resolveLatestRelease("owner/repo", "not-a-version", true, false)
4445
require.NoError(t, err, "should not error when stable release exists")
45-
assert.Equal(t, "v1.5.0", result, "should skip prerelease and return first stable release")
46+
assert.Equal(t, "v1.5.0", result, "should skip prerelease and return highest stable release by semver")
4647
}
4748

4849
// TestResolveLatestRelease_ErrorWhenOnlyPrereleasesExist verifies that an error is

0 commit comments

Comments
 (0)