Skip to content

Commit c369cb7

Browse files
Review and fix precedence of and in bomDeps / depManagement (#4073)
This adds tests to ensure the versions in `JavaModule#depManagement` have precedence over those coming via `JavaModule#bomDeps`. The tests fail for now (might need changes in coursier…) Includes #3924 for now
1 parent 46a199e commit c369cb7

File tree

7 files changed

+275
-41
lines changed

7 files changed

+275
-41
lines changed

build.mill

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ object Deps {
116116
val asmTree = ivy"org.ow2.asm:asm-tree:9.7.1"
117117
val bloopConfig = ivy"ch.epfl.scala::bloop-config:1.5.5"
118118

119-
val coursierVersion = "2.1.19"
119+
val coursierVersion = "2.1.20"
120120
val coursier = ivy"io.get-coursier::coursier:$coursierVersion"
121121
val coursierInterface = ivy"io.get-coursier:interface:1.0.25"
122122
val coursierJvm = ivy"io.get-coursier::coursier-jvm:$coursierVersion"

main/util/src/mill/util/CoursierSupport.scala

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package mill.util
22

33
import coursier.cache.{CacheLogger, FileCache}
4+
import coursier.core.BomDependency
45
import coursier.error.FetchError.DownloadingArtifacts
56
import coursier.error.ResolutionError.CantDownloadModule
67
import coursier.params.ResolutionParams
@@ -253,7 +254,8 @@ trait CoursierSupport {
253254
customizer: Option[Resolution => Resolution] = None,
254255
ctx: Option[mill.api.Ctx.Log] = None,
255256
coursierCacheCustomizer: Option[FileCache[Task] => FileCache[Task]] = None,
256-
resolutionParams: ResolutionParams = ResolutionParams()
257+
resolutionParams: ResolutionParams = ResolutionParams(),
258+
boms: IterableOnce[BomDependency] = Nil
257259
): Result[Resolution] = {
258260

259261
val rootDeps = deps.iterator
@@ -277,6 +279,7 @@ trait CoursierSupport {
277279
.withRepositories(repositories)
278280
.withResolutionParams(resolutionParams0)
279281
.withMapDependenciesOpt(mapDependencies)
282+
.withBoms(boms.toSeq)
280283

281284
resolve.either() match {
282285
case Left(error) =>
@@ -313,6 +316,29 @@ trait CoursierSupport {
313316
}
314317
}
315318

319+
// bin-compat shim
320+
def resolveDependenciesMetadataSafe(
321+
repositories: Seq[Repository],
322+
deps: IterableOnce[Dependency],
323+
force: IterableOnce[Dependency],
324+
mapDependencies: Option[Dependency => Dependency],
325+
customizer: Option[Resolution => Resolution],
326+
ctx: Option[mill.api.Ctx.Log],
327+
coursierCacheCustomizer: Option[FileCache[Task] => FileCache[Task]],
328+
resolutionParams: ResolutionParams
329+
): Result[Resolution] =
330+
resolveDependenciesMetadataSafe(
331+
repositories,
332+
deps,
333+
force,
334+
mapDependencies,
335+
customizer,
336+
ctx,
337+
coursierCacheCustomizer,
338+
resolutionParams,
339+
Nil
340+
)
341+
316342
// bin-compat shim
317343
def resolveDependenciesMetadataSafe(
318344
repositories: Seq[Repository],
@@ -331,7 +357,8 @@ trait CoursierSupport {
331357
customizer,
332358
ctx,
333359
coursierCacheCustomizer,
334-
ResolutionParams()
360+
ResolutionParams(),
361+
Nil
335362
)
336363

337364
}

scalalib/src/mill/scalalib/CoursierModule.scala

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package mill.scalalib
22

33
import coursier.cache.FileCache
4+
import coursier.core.{BomDependency, Resolution}
45
import coursier.params.ResolutionParams
56
import coursier.{Dependency, Repository, Resolve, Type}
6-
import coursier.core.Resolution
77
import mill.define.Task
88
import mill.api.PathRef
99

@@ -247,20 +247,24 @@ object CoursierModule {
247247
*/
248248
def processDeps[T: CoursierModule.Resolvable](
249249
deps: IterableOnce[T],
250-
resolutionParams: ResolutionParams = ResolutionParams()
251-
): Seq[Dependency] = {
250+
resolutionParams: ResolutionParams = ResolutionParams(),
251+
boms: IterableOnce[BomDependency] = Nil
252+
): (Seq[coursier.core.Dependency], coursier.core.DependencyManagement.Map) = {
252253
val deps0 = deps
253254
.map(implicitly[CoursierModule.Resolvable[T]].bind(_, bind))
255+
val boms0 = boms.toSeq
254256
val res = Lib.resolveDependenciesMetadataSafe(
255257
repositories = repositories,
256258
deps = deps0,
257259
mapDependencies = mapDependencies,
258260
customizer = customizer,
259261
coursierCacheCustomizer = coursierCacheCustomizer,
260262
ctx = ctx,
261-
resolutionParams = resolutionParams
263+
resolutionParams = resolutionParams,
264+
boms = boms0
262265
).getOrThrow
263-
res.processedRootDependencies
266+
267+
(res.processedRootDependencies, res.bomDepMgmt)
264268
}
265269
}
266270

scalalib/src/mill/scalalib/JavaModule.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ trait JavaModule
214214
depMgmt: Seq[(DependencyManagement.Key, DependencyManagement.Values)],
215215
overrideVersions: Boolean
216216
): coursier.core.Dependency => coursier.core.Dependency = {
217-
val depMgmtMap = depMgmt.toMap
217+
val depMgmtMap = DependencyManagement.add(Map.empty, depMgmt)
218218
dep =>
219219
val depMgmtKey = DependencyManagement.Key(
220220
dep.module.organization,
@@ -223,7 +223,7 @@ trait JavaModule
223223
dep.publication.classifier
224224
)
225225
val versionOverrideOpt =
226-
if (dep.version == "_") depMgmtMap.get(depMgmtKey).map(_.version)
226+
if (dep.version == "_") depMgmtMap.get(depMgmtKey).map(_.version).filter(_.nonEmpty)
227227
else None
228228
val extraExclusions = depMgmtMap.get(depMgmtKey).map(_.minimizedExclusions)
229229
dep
@@ -236,7 +236,7 @@ trait JavaModule
236236
// - overrides meant to apply to transitive dependencies
237237
// - fill version if it's empty
238238
// - add extra exclusions from dependency management
239-
.withOverrides(dep.overrides ++ depMgmt)
239+
.addOverrides(depMgmt)
240240
.withVersion(versionOverrideOpt.getOrElse(dep.version))
241241
.withMinimizedExclusions(
242242
extraExclusions.fold(dep.minimizedExclusions)(dep.minimizedExclusions.join(_))
@@ -247,7 +247,7 @@ trait JavaModule
247247
* Data from depManagement, converted to a type ready to be passed to coursier
248248
* for dependency resolution
249249
*/
250-
private def processedDependencyManagement(deps: Seq[coursier.core.Dependency])
250+
protected def processedDependencyManagement(deps: Seq[coursier.core.Dependency])
251251
: Seq[(DependencyManagement.Key, DependencyManagement.Values)] = {
252252
val keyValuesOrErrors =
253253
deps.map { depMgmt =>

scalalib/src/mill/scalalib/Lib.scala

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package mill
22
package scalalib
33

4+
import coursier.core.BomDependency
45
import coursier.params.ResolutionParams
56
import coursier.util.Task
67
import coursier.{Dependency, Repository, Resolution, Type}
@@ -61,7 +62,8 @@ object Lib {
6162
coursierCacheCustomizer: Option[
6263
coursier.cache.FileCache[Task] => coursier.cache.FileCache[Task]
6364
] = None,
64-
resolutionParams: ResolutionParams = ResolutionParams()
65+
resolutionParams: ResolutionParams = ResolutionParams(),
66+
boms: IterableOnce[BomDependency] = Nil
6567
): Result[Resolution] = {
6668
val depSeq = deps.iterator.toSeq
6769
mill.util.Jvm.resolveDependenciesMetadataSafe(
@@ -72,10 +74,34 @@ object Lib {
7274
customizer = customizer,
7375
ctx = ctx,
7476
coursierCacheCustomizer = coursierCacheCustomizer,
75-
resolutionParams = resolutionParams
77+
resolutionParams = resolutionParams,
78+
boms = boms
7679
)
7780
}
7881

82+
// bin-compat shim
83+
def resolveDependenciesMetadataSafe(
84+
repositories: Seq[Repository],
85+
deps: IterableOnce[BoundDep],
86+
mapDependencies: Option[Dependency => Dependency],
87+
customizer: Option[coursier.core.Resolution => coursier.core.Resolution],
88+
ctx: Option[Ctx.Log],
89+
coursierCacheCustomizer: Option[
90+
coursier.cache.FileCache[Task] => coursier.cache.FileCache[Task]
91+
],
92+
resolutionParams: ResolutionParams
93+
): Result[Resolution] =
94+
resolveDependenciesMetadataSafe(
95+
repositories,
96+
deps,
97+
mapDependencies,
98+
customizer,
99+
ctx,
100+
coursierCacheCustomizer,
101+
resolutionParams,
102+
Nil
103+
)
104+
79105
// bin-compat shim
80106
def resolveDependenciesMetadataSafe(
81107
repositories: Seq[Repository],
@@ -94,7 +120,8 @@ object Lib {
94120
customizer,
95121
ctx,
96122
coursierCacheCustomizer,
97-
ResolutionParams()
123+
ResolutionParams(),
124+
Nil
98125
)
99126

100127
/**

scalalib/src/mill/scalalib/PublishModule.scala

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package mill
22
package scalalib
33

4+
import coursier.core.Configuration
45
import mill.define.{Command, ExternalModule, Task}
56
import mill.api.{JarManifest, PathRef, Result}
67
import mill.main.Tasks
@@ -125,21 +126,11 @@ trait PublishModule extends JavaModule { outer =>
125126
*/
126127
def bomDetails: T[(Map[coursier.core.Module, String], coursier.core.DependencyManagement.Map)] =
127128
Task {
128-
val processedDeps = defaultResolver().processDeps(
129-
transitiveCompileIvyDeps() ++ transitiveIvyDeps(),
130-
resolutionParams = resolutionParams()
129+
val (processedDeps, depMgmt) = defaultResolver().processDeps(
130+
processedIvyDeps(),
131+
resolutionParams = resolutionParams(),
132+
boms = allBomDeps().toSeq.map(_.withConfig(Configuration.compile))
131133
)
132-
val depMgmt: coursier.core.DependencyManagement.Map =
133-
if (processedDeps.isEmpty) Map.empty
134-
else {
135-
val overrides = processedDeps.map(_.overrides)
136-
overrides.tail.foldLeft(overrides.head) { (acc, map) =>
137-
acc.filter {
138-
case (key, values) =>
139-
map.get(key).contains(values)
140-
}
141-
}
142-
}
143134
(processedDeps.map(_.moduleVersion).toMap, depMgmt)
144135
}
145136

@@ -162,20 +153,28 @@ trait PublishModule extends JavaModule { outer =>
162153
else
163154
dep
164155
}
165-
val overrides =
166-
depManagement().toSeq.map(bindDependency()).map(_.dep)
167-
.filter(depMgmt => depMgmt.version.nonEmpty && depMgmt.version != "_")
168-
.map { depMgmt =>
169-
Ivy.Override(
170-
depMgmt.module.organization.value,
171-
depMgmt.module.name.value,
172-
depMgmt.version
173-
)
174-
} ++
175-
bomDepMgmt.map {
156+
val overrides = {
157+
val depMgmtEntries = processedDependencyManagement(
158+
depManagement().toSeq
159+
.map(bindDependency())
160+
.map(_.dep)
161+
.filter(depMgmt => depMgmt.version.nonEmpty && depMgmt.version != "_")
162+
)
163+
val entries = coursier.core.DependencyManagement.add(
164+
Map.empty,
165+
depMgmtEntries ++ bomDepMgmt
166+
)
167+
entries.toVector
168+
.map {
176169
case (key, values) =>
177-
Ivy.Override(key.organization.value, key.name.value, values.version)
170+
Ivy.Override(
171+
key.organization.value,
172+
key.name.value,
173+
values.version
174+
)
178175
}
176+
.sortBy(value => (value.organization, value.name, value.version))
177+
}
179178
val ivy = Ivy(artifactMetadata(), publishXmlDeps0, extraPublish(), overrides)
180179
val ivyPath = T.dest / "ivy.xml"
181180
os.write.over(ivyPath, ivy)

0 commit comments

Comments
 (0)