Skip to content

Commit 4f0a472

Browse files
committed
Force minimal sbt-typelevel-settings plugin version
1 parent 14b4fb5 commit 4f0a472

File tree

2 files changed

+66
-30
lines changed

2 files changed

+66
-30
lines changed

coordinator/src/main/scala/ProjectConfigDiscovery.scala

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -283,21 +283,41 @@ class ProjectConfigDiscovery(internalProjectConfigsPath: java.io.File, requiredC
283283
case _ => None
284284
}
285285
}
286-
def scala3VersionDefs =
287-
commonBuildFiles(projectDir).flatMap { file =>
288-
import Scala3VersionDef.Replecement
289-
tryReadLines(file).collect { case Scala3VersionDef(toMatch, replecement) =>
290-
SourcePatch(
291-
path = file.relativeTo(projectDir).toString,
292-
pattern = toMatch,
293-
replaceWith = replecement
294-
)
295-
}
286+
object SemVerRef:
287+
def unapply(v: String): Option[SemVersion] = SemVersion.unapply(v)
288+
object AddSbtPluginRef:
289+
def unapply(v: String): Option[AddSbtPlugin] = AddSbtPlugin.unapply(v)
290+
291+
commonBuildFiles(projectDir).flatMap { file =>
292+
def patch(pattern: String, replacement: String) = SourcePatch(
293+
path = file.relativeTo(projectDir).toString,
294+
pattern = pattern,
295+
replaceWith = replacement
296+
)
297+
import Scala3VersionDef.Replecement
298+
tryReadLines(file).collect {
299+
case Scala3VersionDef(toMatch, replecement) =>
300+
patch(pattern = toMatch, replacement = replecement)
301+
302+
case line @ AddSbtPluginRef(
303+
defn @ AddSbtPlugin("org.typelevel", "sbt-typelevel-settings", SemVerRef(version))
304+
) if version < SemVersion.unsafe("0.7.7") =>
305+
patch(line, defn.copy(version = "0.7.7").show)
296306
}
297-
end scala3VersionDefs
298-
scala3VersionDefs
307+
}
299308
end discoverSourcePatches
300309

310+
case class AddSbtPlugin(org: String, name: String, version: String) {
311+
def show = s"""addSbtPlugin("$org" % "$name" % "$version")"""
312+
}
313+
object AddSbtPlugin {
314+
def unapply(v: String): Option[AddSbtPlugin] = v.trim() match {
315+
case s"""addSbtPlugin("$org"${_}%${_}"$name"${_}%${_}"$version")""" =>
316+
Some(AddSbtPlugin(org, name, version))
317+
case _ => None
318+
}
319+
}
320+
301321
private def tryReadLines(file: os.Path): Seq[String] = {
302322
try os.read.lines(file).toSeq
303323
catch {

coordinator/src/main/scala/core.scala

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -120,21 +120,37 @@ case class SemVersion(
120120
major: Int,
121121
minor: Int,
122122
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

Comments
 (0)