@@ -120,21 +120,37 @@ case class SemVersion(
120
120
major : Int ,
121
121
minor : Int ,
122
122
patch : Int ,
123
- milestone : Option [String ]
124
- )
125
- given Conversion [String , SemVersion ] = version =>
126
- // There are multiple projects that don't follow standarnd naming convention, especially in snpashots
127
- // becouse of that it needs to be more flexible, e.g to handle: x.y-z-<hash>, x.y, x.y-milestone
128
- val parts = version.split('.' ).flatMap(_.split('-' )).filter(_.nonEmpty)
129
- val versionNums = parts.take(3 ).takeWhile(_.forall(_.isDigit))
130
- def versionPart (idx : Int ) =
131
- versionNums.lift(idx).flatMap(_.toIntOption).getOrElse(0 )
132
- val milestone = Some (parts.drop(versionNums.size))
133
- .filter(_.nonEmpty)
134
- .map(_.mkString(" -" ))
135
- SemVersion (
136
- major = versionPart(0 ),
137
- minor = versionPart(1 ),
138
- patch = versionPart(2 ),
139
- milestone = milestone
140
- )
123
+ milestone : Option [String ] = None
124
+ ) extends Ordered [SemVersion ] {
125
+ override def compare (that : SemVersion ): Int = {
126
+ that match
127
+ case SemVersion (`major`, `minor`, `patch`, milestone) =>
128
+ def parseMilestone (v : Option [String ]): Int = v.fold(0 ){
129
+ _.filter(_.isDigit).toIntOption.getOrElse(Int .MaxValue )
130
+ }
131
+ parseMilestone(this .milestone).compareTo(parseMilestone(milestone))
132
+ case SemVersion (`major`, `minor`, patch, _) => this .patch.compareTo(patch)
133
+ case SemVersion (`major`, minor, _, _) => this .minor.compareTo(minor)
134
+ case SemVersion (major, _, _, _) => this .major.compareTo(major)
135
+ }
136
+ }
137
+ object SemVersion {
138
+ def unsafe (version : String ): SemVersion = SemVersion .unapply(version).get
139
+ def unapply (version : String ): Option [SemVersion ] = util.Try {
140
+ // There are multiple projects that don't follow standarnd naming convention, especially in snpashots
141
+ // becouse of that it needs to be more flexible, e.g to handle: x.y-z-<hash>, x.y, x.y-milestone
142
+ val parts = version.split('.' ).flatMap(_.split('-' )).filter(_.nonEmpty)
143
+ val versionNums = parts.take(3 ).takeWhile(_.forall(_.isDigit))
144
+ def versionPart (idx : Int ) =
145
+ versionNums.lift(idx).flatMap(_.toIntOption).getOrElse(0 )
146
+ val milestone = Some (parts.drop(versionNums.size))
147
+ .filter(_.nonEmpty)
148
+ .map(_.mkString(" -" ))
149
+ SemVersion (
150
+ major = versionPart(0 ),
151
+ minor = versionPart(1 ),
152
+ patch = versionPart(2 ),
153
+ milestone = milestone
154
+ )
155
+ }.toOption
156
+ }
0 commit comments