Skip to content

Commit 71b727a

Browse files
authored
Remove conflicting Scala 2.13 io.get-coursier:dependency dependency & add a CI check (#3472)
1 parent a8db59b commit 71b727a

File tree

3 files changed

+60
-0
lines changed

3 files changed

+60
-0
lines changed

Diff for: .github/scripts/check-cross-version-deps.sc

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#!/usr/bin/env -S scala-cli shebang
2+
//> using scala 3
3+
//> using toolkit default
4+
5+
val modules =
6+
os.proc(os.pwd / "mill", "-i", "resolve", "__[]")
7+
.call(cwd = os.pwd)
8+
.out
9+
.lines()
10+
11+
for { module <- modules } {
12+
println(s"Checking for $module...")
13+
val depRegex = "[│└─\\S\\s]+\\s([\\w.-]+):([\\w.-]+):([\\w\\s\\S.-]+)".r
14+
val scalaDepSuffixRegex = "^(.+?)(_[23](?:\\.\\d{2})?)?$".r
15+
val deps = os.proc(os.pwd / "mill", "-i", s"$module.ivyDepsTree")
16+
.call(cwd = os.pwd)
17+
.out
18+
.lines()
19+
.map { case depRegex(org, name, depVersion) => (org, name, depVersion) }
20+
val scalaVersionsByOrgAndName = deps
21+
.groupBy { case (org, scalaDepSuffixRegex(nameWithoutSuffix, _), _) =>
22+
s"$org:$nameWithoutSuffix"
23+
}
24+
.map { case (key, entries) =>
25+
key -> entries.map { case (_, scalaDepSuffixRegex(_, scalaVersion), _) =>
26+
scalaVersion
27+
}.distinct
28+
}
29+
.filter { case (_, scalaVersions) => scalaVersions.head != null } // filter out non-Scala deps
30+
println("Checking for clashing dependency Scala versions...")
31+
val conflictEntries: Map[String, Vector[String]] =
32+
scalaVersionsByOrgAndName
33+
.filter { case (key, scalaVersions) =>
34+
if scalaVersions.length == 1 then
35+
println(s"[info] $key${scalaVersions.head} (OK)")
36+
false
37+
else
38+
println(
39+
s"[${Console.RED}error${Console.RESET}] $key: multiple conflicting Scala versions: ${scalaVersions.mkString(", ")}"
40+
)
41+
true
42+
}
43+
if conflictEntries.nonEmpty then
44+
println(s"${Console.RED}ERROR: Found ${conflictEntries.size} conflicting entries for $module:")
45+
conflictEntries.foreach {
46+
case (key, scalaVersions) =>
47+
println(s" $key: multiple conflicting Scala versions: ${scalaVersions.mkString(", ")}")
48+
}
49+
println(Console.RESET)
50+
sys.exit(1)
51+
else println(s"[info] $module OK")
52+
}
53+
54+
println("Checks completed for:")
55+
modules.foreach(m => println(s" $m"))
56+
println("No conflicts detected.")
57+
sys.exit(0)

Diff for: .github/workflows/ci.yml

+2
Original file line numberDiff line numberDiff line change
@@ -1493,6 +1493,8 @@ jobs:
14931493
run: ./mill -i __.checkNativeImageConfFormat
14941494
- name: Check Ammonite availability
14951495
run: ./mill -i 'dummy.amm[_].resolvedRunIvyDeps'
1496+
- name: Check for cross Scala version conflicts
1497+
run: .github/scripts/check-cross-version-deps.sc
14961498
- name: Scalafix check
14971499
run: |
14981500
./mill -i __.fix --check || (

Diff for: project/deps.sc

+1
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ object Deps {
160160
def coursierCli = ivy"io.get-coursier:coursier-cli_2.13:${Versions.coursierCli}"
161161
def coursierJvm = ivy"io.get-coursier:coursier-jvm_2.13:${Versions.coursier}"
162162
.exclude(("com.github.plokhotnyuk.jsoniter-scala", "jsoniter-scala-core_2.13"))
163+
.exclude("io.get-coursier" -> "dependency_2.13")
163164
def coursierLauncher = ivy"io.get-coursier:coursier-launcher_2.13:${Versions.coursier}"
164165
.exclude(("ai.kien", "python-native-libs_2.13"))
165166
.exclude(("org.scala-lang.modules", "scala-collection-compat_2.13"))

0 commit comments

Comments
 (0)