|
6 | 6 | "io"
|
7 | 7 | "net/http"
|
8 | 8 | "runtime"
|
| 9 | + "sort" |
| 10 | + "strconv" |
9 | 11 | "strings"
|
10 | 12 | "time"
|
11 | 13 | )
|
@@ -132,3 +134,59 @@ func ListInitiaReleases() InitiaVersionWithDownloadURL {
|
132 | 134 |
|
133 | 135 | return versions
|
134 | 136 | }
|
| 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