@@ -127,7 +127,8 @@ func ParseVersion(versionStr string) Version {
127127 versionStr = strings .TrimPrefix (versionStr , "V" )
128128
129129 // Parse version with regex: X.Y.Z or X.Y.Z-type.num
130- re := regexp .MustCompile (`^(\d+)\.(\d+)\.(\d+)(?:-(alpha|beta|rc)\.(\d+))?$` )
130+ // Supports: dev, alpha, beta, rc
131+ re := regexp .MustCompile (`^(\d+)\.(\d+)\.(\d+)(?:-(dev|alpha|beta|rc)\.(\d+))?$` )
131132 matches := re .FindStringSubmatch (versionStr )
132133
133134 if len (matches ) > 1 {
@@ -161,11 +162,30 @@ func CompareVersions(v1, v2 Version) int {
161162 return v1 .Patch - v2 .Patch
162163 }
163164
164- if v1 .PrereleaseNum != v2 .PrereleaseNum {
165- return v1 .PrereleaseNum - v2 .PrereleaseNum
165+ // Handle stable vs prerelease versions
166+ // According to semver: stable version (no prerelease) is GREATER than any prerelease
167+ // Example: v11.0.0 > v11.0.0-rc.1 > v11.0.0-beta.1 > v11.0.0-alpha.1 > v11.0.0-dev.1
168+ if v1 .PrereleaseName == "" && v2 .PrereleaseName != "" {
169+ return 1 // v1 is stable, v2 is prerelease → v1 > v2
170+ }
171+ if v1 .PrereleaseName != "" && v2 .PrereleaseName == "" {
172+ return - 1 // v1 is prerelease, v2 is stable → v1 < v2
173+ }
174+
175+ // Both are prereleases or both are stable
176+ if v1 .PrereleaseName != v2 .PrereleaseName {
177+ // Compare prerelease type names: dev < alpha < beta < rc
178+ order := map [string ]int {
179+ "dev" : 1 ,
180+ "alpha" : 2 ,
181+ "beta" : 3 ,
182+ "rc" : 4 ,
183+ }
184+ return order [v1 .PrereleaseName ] - order [v2 .PrereleaseName ]
166185 }
167186
168- return 0
187+ // Same prerelease type, compare numbers
188+ return v1 .PrereleaseNum - v2 .PrereleaseNum
169189}
170190
171191func SortVersions (versions []map [string ]string ) []map [string ]string {
0 commit comments