Better properties substitution (#2)

This commit is contained in:
Alexandre Archambault 2015-12-30 01:34:46 +01:00
parent 00d11017f7
commit 76e989d21c
4 changed files with 57 additions and 42 deletions

View File

@ -613,20 +613,25 @@ case class Resolution(
.map(_._2.properties)
.fold(project.properties)(project.properties ++ _)
val approxProperties = propertiesMap(approxProperties0)
val approxProperties = propertiesMap(approxProperties0) ++ Seq(
"project.groupId" -> project.module.organization,
"project.artifactId" -> project.module.name,
"project.version" -> project.version
)
val profileDependencies =
profiles(
project,
approxProperties,
profileActivation getOrElse defaultProfileActivation
).flatMap(_.dependencies)
).flatMap(p => p.dependencies ++ p.dependencyManagement)
val modules =
(project.dependencies ++ profileDependencies)
.collect{
case ("import", dep) => dep.moduleVersion
}
val modules = withProperties(
project.dependencies ++ project.dependencyManagement ++ profileDependencies,
approxProperties
).collect {
case ("import", dep) => dep.moduleVersion
}
modules.toSet ++ project.parent
}
@ -683,13 +688,21 @@ case class Resolution(
*/
def withDependencyManagement(project: Project): Project = {
// A bit fragile, but seems to work
// TODO Add non regression test for the touchy org.glassfish.jersey.core:jersey-client:2.19
// (for the way it uses org.glassfish.hk2:hk2-bom,2.4.0-b25)
val approxProperties0 =
project.parent
.filter(projectCache.contains)
.map(projectCache(_)._2.properties.toMap)
.fold(project.properties)(project.properties ++ _)
val approxProperties = propertiesMap(approxProperties0)
val approxProperties = propertiesMap(approxProperties0) ++ Seq(
"project.groupId" -> project.module.organization,
"project.artifactId" -> project.module.name,
"project.version" -> project.version
)
val profiles0 = profiles(
project,
@ -698,20 +711,29 @@ case class Resolution(
)
val dependencies0 = addDependencies(
project.dependencies +: profiles0.map(_.dependencies)
(project.dependencies +: profiles0.map(_.dependencies)).map(withProperties(_, approxProperties))
)
val dependenciesMgmt0 = addDependencies(
(project.dependencyManagement +: profiles0.map(_.dependencyManagement)).map(withProperties(_, approxProperties))
)
val properties0 =
(project.properties /: profiles0) { (acc, p) =>
acc ++ p.properties
}
val deps = (
val deps0 = (
dependencies0
.collect { case ("import", dep) =>
dep.moduleVersion
} ++
dependenciesMgmt0
.collect { case ("import", dep) =>
dep.moduleVersion
} ++
project.parent
).filter(projectCache.contains)
)
val deps = deps0.filter(projectCache.contains)
val projs = deps
.map(projectCache(_)._2)
@ -721,7 +743,9 @@ case class Resolution(
profiles0.map(_.dependencyManagement) ++
projs.map(_.dependencyManagement)
)
).foldLeft(Map.empty[DepMgmt.Key, (String, Dependency)])(DepMgmt.addSeq)
)
.map(withProperties(_, approxProperties))
.foldLeft(Map.empty[DepMgmt.Key, (String, Dependency)])(DepMgmt.addSeq)
val depsSet = deps.toSet
@ -735,7 +759,10 @@ case class Resolution(
.filter(projectCache.contains)
.toSeq
.flatMap(projectCache(_)._2.dependencies),
dependencyManagement = depMgmt.values.toSeq,
dependencyManagement = depMgmt.values.toSeq
.filterNot{case (config, dep) =>
config == "import" && depsSet(dep.moduleVersion)
},
properties = project.parent
.filter(projectCache.contains)
.map(projectCache(_)._2.properties)

View File

@ -105,7 +105,7 @@ object FromSbt {
ivyConfigurations,
None,
Nil,
Map.empty,
Nil,
Nil,
None,
None,

View File

@ -36,7 +36,7 @@ object ResolutionTests extends TestSuite {
dependencies = Seq(
"" -> Dependency(Module("acme", "play-json"), "${playJsonVersion}"),
"" -> Dependency(Module("${project.groupId}", "${configName}"), "1.3.0")),
properties = Map(
properties = Seq(
"playJsonVersion" -> "2.4.0",
"configName" -> "config")),
@ -83,7 +83,7 @@ object ResolutionTests extends TestSuite {
dependencies = Seq(
"" -> Dependency(Module("gov.nsa", "secure-pgp"), "10.0",
exclusions = Set(("*", "${crypto.name}")))),
properties = Map("crypto.name" -> "crypto", "dummy" -> "2")),
properties = Seq("crypto.name" -> "crypto", "dummy" -> "2")),
Project(Module("com.thoughtworks.paranamer", "paranamer-parent"), "2.6",
dependencies = Seq(
@ -108,29 +108,29 @@ object ResolutionTests extends TestSuite {
"test" -> Dependency(Module("org.scalaverification", "scala-verification"), "1.12.4"))))),
Project(Module("com.github.dummy", "libb"), "0.5.3",
properties = Map("special" -> "true"),
properties = Seq("special" -> "true"),
profiles = Seq(
Profile("default", activation = Profile.Activation(properties = Seq("special" -> None)), dependencies = Seq(
"" -> Dependency(Module("org.escalier", "librairie-standard"), "2.11.6"))))),
Project(Module("com.github.dummy", "libb"), "0.5.4",
properties = Map("special" -> "true"),
properties = Seq("special" -> "true"),
profiles = Seq(
Profile("default", activation = Profile.Activation(properties = Seq("special" -> Some("true"))), dependencies = Seq(
"" -> Dependency(Module("org.escalier", "librairie-standard"), "2.11.6"))))),
Project(Module("com.github.dummy", "libb"), "0.5.5",
properties = Map("special" -> "true"),
properties = Seq("special" -> "true"),
profiles = Seq(
Profile("default", activation = Profile.Activation(properties = Seq("special" -> Some("!false"))), dependencies = Seq(
"" -> Dependency(Module("org.escalier", "librairie-standard"), "2.11.6"))))),
Project(Module("com.github.dummy", "libb-parent"), "0.5.6",
properties = Map("special" -> "true")),
properties = Seq("special" -> "true")),
Project(Module("com.github.dummy", "libb"), "0.5.6",
parent = Some(Module("com.github.dummy", "libb-parent"), "0.5.6"),
properties = Map("special" -> "true"),
properties = Seq("special" -> "true"),
profiles = Seq(
Profile("default", activation = Profile.Activation(properties = Seq("special" -> Some("!false"))), dependencies = Seq(
"" -> Dependency(Module("org.escalier", "librairie-standard"), "2.11.6"))))),
@ -243,14 +243,11 @@ object ResolutionTests extends TestSuite {
)
val res = await(resolve0(
Set(dep)
))
)).copy(filter = None, projectCache = Map.empty)
val expected = Resolution(
rootDependencies = Set(dep),
dependencies = Set(dep.withCompileScope) ++ trDeps.map(_.withCompileScope),
projectCache = Map(
projectsMap(dep.moduleVersion).kv
) ++ trDeps.map(trDep => projectsMap(trDep.moduleVersion).kv)
dependencies = Set(dep.withCompileScope) ++ trDeps.map(_.withCompileScope)
)
assert(res == expected)
@ -267,14 +264,11 @@ object ResolutionTests extends TestSuite {
)
val res = await(resolve0(
Set(dep)
))
)).copy(filter = None, projectCache = Map.empty)
val expected = Resolution(
rootDependencies = Set(dep),
dependencies = Set(dep.withCompileScope) ++ trDeps.map(_.withCompileScope),
projectCache = Map(
projectsMap(dep.moduleVersion).kv
) ++ trDeps.map(trDep => projectsMap(trDep.moduleVersion).kv)
dependencies = Set(dep.withCompileScope) ++ trDeps.map(_.withCompileScope)
)
assert(res == expected)
@ -291,14 +285,11 @@ object ResolutionTests extends TestSuite {
)
val res = await(resolve0(
Set(dep)
))
)).copy(filter = None, projectCache = Map.empty)
val expected = Resolution(
rootDependencies = Set(dep),
dependencies = Set(dep.withCompileScope) ++ trDeps.map(_.withCompileScope),
projectCache = Map(
projectsMap(dep.moduleVersion).kv
) ++ trDeps.map(trDep => projectsMap(trDep.moduleVersion).kv)
dependencies = Set(dep.withCompileScope) ++ trDeps.map(_.withCompileScope)
)
assert(res == expected)
@ -309,14 +300,11 @@ object ResolutionTests extends TestSuite {
val dep = Dependency(Module("hudsucker", "mail"), "10.0")
val res = await(resolve0(
Set(dep)
)).copy(filter = None)
)).copy(filter = None, projectCache = Map.empty)
val expected = Resolution(
rootDependencies = Set(dep),
dependencies = Set(dep.withCompileScope),
projectCache = Map(
projectsMap(dep.moduleVersion).kv
)
dependencies = Set(dep.withCompileScope)
)
assert(res == expected)

View File

@ -39,7 +39,7 @@ package object test {
parent: Option[ModuleVersion] = None,
dependencyManagement: Seq[(String, Dependency)] = Seq.empty,
configurations: Map[String, Seq[String]] = Map.empty,
properties: Map[String, String] = Map.empty,
properties: Seq[(String, String)] = Seq.empty,
profiles: Seq[Profile] = Seq.empty,
versions: Option[core.Versions] = None,
snapshotVersioning: Option[core.SnapshotVersioning] = None,