diff --git a/core/shared/src/main/scala/coursier/core/Resolution.scala b/core/shared/src/main/scala/coursier/core/Resolution.scala index 5db05a72d..ac197caa4 100644 --- a/core/shared/src/main/scala/coursier/core/Resolution.scala +++ b/core/shared/src/main/scala/coursier/core/Resolution.scala @@ -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) diff --git a/plugin/src/main/scala/coursier/FromSbt.scala b/plugin/src/main/scala/coursier/FromSbt.scala index 0611e2ed2..0bbc0349b 100644 --- a/plugin/src/main/scala/coursier/FromSbt.scala +++ b/plugin/src/main/scala/coursier/FromSbt.scala @@ -105,7 +105,7 @@ object FromSbt { ivyConfigurations, None, Nil, - Map.empty, + Nil, Nil, None, None, diff --git a/tests/shared/src/test/scala/coursier/test/ResolutionTests.scala b/tests/shared/src/test/scala/coursier/test/ResolutionTests.scala index 123461fc1..e8dab1420 100644 --- a/tests/shared/src/test/scala/coursier/test/ResolutionTests.scala +++ b/tests/shared/src/test/scala/coursier/test/ResolutionTests.scala @@ -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) diff --git a/tests/shared/src/test/scala/coursier/test/package.scala b/tests/shared/src/test/scala/coursier/test/package.scala index 1bb6d4487..30fa8f3ea 100644 --- a/tests/shared/src/test/scala/coursier/test/package.scala +++ b/tests/shared/src/test/scala/coursier/test/package.scala @@ -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,