Skip to content
This repository was archived by the owner on Feb 10, 2026. It is now read-only.

Commit 2b79f21

Browse files
pratap0007tekton-robot
authored andcommitted
Fix resource versions sorting
This patch fix versions sorting to sort version strings using sematic versioning rule Signed-off-by: Shiv Verma <shverma@redhat.com>
1 parent 81bd067 commit 2b79f21

File tree

16 files changed

+2306
-4
lines changed

16 files changed

+2306
-4
lines changed

api/pkg/cli/hub/get_resource.go

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"sort"
2222
"strings"
2323

24+
"github.com/Masterminds/semver/v3"
2425
rclient "github.com/tektoncd/hub/api/v1/gen/http/resource/client"
2526
)
2627

@@ -231,9 +232,8 @@ func (t *tektonHubClient) GetResourceVersionslist(r ResourceOption) ([]string, e
231232
for i := range opts.hubResVersions.Versions {
232233
ver = append(ver, *opts.hubResVersions.Versions[i].Version)
233234
}
234-
sort.Sort(sort.Reverse(sort.StringSlice(ver)))
235235

236-
return ver, nil
236+
return sortVersionsSemanticaly(ver), nil
237237
}
238238

239239
// Endpoint computes the endpoint url using input provided
@@ -484,7 +484,58 @@ func findArtifactHubResourceVersions(data []byte) ([]string, error) {
484484
for _, r := range resp.AvailableVersions {
485485
versions = append(versions, r.Version)
486486
}
487-
sort.Sort(sort.Reverse(sort.StringSlice(versions)))
488487

489-
return versions, nil
488+
return sortVersionsSemanticaly(versions), nil
489+
}
490+
491+
// sortVersionsSemanticaly sorts version strings using semantic versioning rules
492+
// Returns versions in descending order (latest first), preserving original format
493+
func sortVersionsSemanticaly(versions []string) []string {
494+
if len(versions) <= 1 {
495+
return versions
496+
}
497+
498+
// Create a struct to hold both original string and parsed version
499+
type versionPair struct {
500+
original string
501+
semver *semver.Version
502+
}
503+
504+
var validVersions []versionPair
505+
var invalidVersions []string
506+
507+
// Parse versions, keeping original strings and invalid ones separate
508+
for _, v := range versions {
509+
// Try to parse as semantic version
510+
version, err := semver.NewVersion(v)
511+
if err != nil {
512+
// If it's not a valid semver, keep it as string for fallback sorting
513+
invalidVersions = append(invalidVersions, v)
514+
} else {
515+
validVersions = append(validVersions, versionPair{
516+
original: v,
517+
semver: version,
518+
})
519+
}
520+
}
521+
522+
// Sort valid versions by their semver objects in descending order (latest first)
523+
sort.Slice(validVersions, func(i, j int) bool {
524+
return validVersions[i].semver.GreaterThan(validVersions[j].semver)
525+
})
526+
527+
// Sort invalid versions alphabetically in descending order as fallback
528+
sort.Sort(sort.Reverse(sort.StringSlice(invalidVersions)))
529+
530+
// Convert back to original strings and combine results
531+
var result []string
532+
533+
// Add properly sorted semantic versions first (in original format)
534+
for _, vp := range validVersions {
535+
result = append(result, vp.original)
536+
}
537+
538+
result = append(result, invalidVersions...)
539+
540+
return result
490541
}

api/pkg/cli/hub/get_resource_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,12 @@ func TestGetResourceEndpoint(t *testing.T) {
3939
url = opt.Endpoint()
4040
assert.Equal(t, "/v1/resource/tekton/task/abc/0.1.1", url)
4141
}
42+
43+
func TestSortVersionsSemanticaly(t *testing.T) {
44+
// includes valid semver and some invalid strings (alpha/beta)
45+
in := []string{"0.9.0", "1.0.0", "v0.10.0", "alpha", "2.0.0", "1.2.3", "beta"}
46+
out := sortVersionsSemanticaly(in)
47+
48+
// valid semvers should be in descending order first
49+
assert.Equal(t, []string{"2.0.0", "1.2.3", "1.0.0", "v0.10.0", "0.9.0", "beta", "alpha"}, out)
50+
}

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ toolchain go1.23.8
77
require (
88
github.com/ActiveState/vt10x v1.3.1
99
github.com/AlecAivazis/survey/v2 v2.3.7
10+
github.com/Masterminds/semver/v3 v3.4.0
1011
github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2
1112
github.com/fatih/color v1.18.0
1213
github.com/go-co-op/gocron v1.37.0

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.3.1 h1:gUDtaZk8het
111111
github.com/AzureAD/microsoft-authentication-library-for-go v1.3.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
112112
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
113113
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
114+
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
115+
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
114116
github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
115117
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
116118
github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=

vendor/github.com/Masterminds/semver/v3/.gitignore

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/Masterminds/semver/v3/.golangci.yml

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)