Skip to content

Commit 93935ff

Browse files
committed
impv: genius version sorting
1 parent 85bf4cf commit 93935ff

File tree

2 files changed

+59
-1
lines changed

2 files changed

+59
-1
lines changed

models/initia/run_l1_node.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func NewRunL1NodeVersionSelect(state *RunL1NodeState) *RunL1NodeVersionSelect {
9999
sort.Sort(sort.Reverse(sort.StringSlice(options)))
100100
return &RunL1NodeVersionSelect{
101101
Selector: utils.Selector[string]{
102-
Options: options,
102+
Options: utils.SortVersions(versions),
103103
},
104104
state: state,
105105
versions: versions,

utils/http.go

+58
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"io"
77
"net/http"
88
"runtime"
9+
"sort"
10+
"strconv"
911
"strings"
1012
"time"
1113
)
@@ -132,3 +134,59 @@ func ListInitiaReleases() InitiaVersionWithDownloadURL {
132134

133135
return versions
134136
}
137+
138+
// sortVersions sorts the versions based on semantic versioning, including pre-release handling
139+
func SortVersions(versions InitiaVersionWithDownloadURL) []string {
140+
var versionTags []string
141+
for tag := range versions {
142+
versionTags = append(versionTags, tag)
143+
}
144+
145+
// Sort based on major, minor, patch, and pre-release metadata
146+
sort.Slice(versionTags, func(i, j int) bool {
147+
return compareSemVer(versionTags[i], versionTags[j])
148+
})
149+
150+
return versionTags
151+
}
152+
153+
// compareSemVer compares two semantic version strings and returns true if v1 should be ordered before v2
154+
func compareSemVer(v1, v2 string) bool {
155+
// Trim "v" prefix
156+
v1 = strings.TrimPrefix(v1, "v")
157+
v2 = strings.TrimPrefix(v2, "v")
158+
159+
v1Main, v1Pre := splitVersion(v1)
160+
v2Main, v2Pre := splitVersion(v2)
161+
162+
// Compare the main (major, minor, patch) versions
163+
v1MainParts := strings.Split(v1Main, ".")
164+
v2MainParts := strings.Split(v2Main, ".")
165+
for i := 0; i < 3; i++ {
166+
v1Part, _ := strconv.Atoi(v1MainParts[i])
167+
v2Part, _ := strconv.Atoi(v2MainParts[i])
168+
169+
if v1Part != v2Part {
170+
return v1Part > v2Part
171+
}
172+
}
173+
174+
// Compare pre-release parts if main versions are equal
175+
// A pre-release version is always ordered lower than the normal version
176+
if v1Pre == "" && v2Pre != "" {
177+
return true
178+
}
179+
if v1Pre != "" && v2Pre == "" {
180+
return false
181+
}
182+
return v1Pre > v2Pre
183+
}
184+
185+
// splitVersion separates the main version (e.g., "0.4.11") from the pre-release (e.g., "initiation.1")
186+
func splitVersion(version string) (mainVersion, preRelease string) {
187+
if strings.Contains(version, "-") {
188+
parts := strings.SplitN(version, "-", 2)
189+
return parts[0], parts[1]
190+
}
191+
return version, ""
192+
}

0 commit comments

Comments
 (0)