diff --git a/core/shared/src/main/scala/coursier/core/Resolution.scala b/core/shared/src/main/scala/coursier/core/Resolution.scala index 6a1beb59f..ac4a4661a 100644 --- a/core/shared/src/main/scala/coursier/core/Resolution.scala +++ b/core/shared/src/main/scala/coursier/core/Resolution.scala @@ -351,6 +351,7 @@ object Resolution { private val mavenScopes = { val base = Map[String, Set[String]]( "compile" -> Set("compile"), + "optional" -> Set("compile", "optional"), "provided" -> Set(), "runtime" -> Set("compile", "runtime"), "test" -> Set() @@ -463,10 +464,16 @@ object Resolution { default else keepOpt.fold(default) { keep => - if (keep(config)) - // really keeping the from.configuration, with its fallback config part - Seq(dep.copy(configuration = from.configuration)) - else + if (keep(config)) { + val depConfig = + if (actualConfig == "optional") + defaultConfiguration + else + // really keeping the from.configuration, with its fallback config part + from.configuration + + Seq(dep.copy(configuration = depConfig)) + } else Nil } } diff --git a/core/shared/src/main/scala/coursier/maven/MavenRepository.scala b/core/shared/src/main/scala/coursier/maven/MavenRepository.scala index 5eb816d5f..0be04d393 100644 --- a/core/shared/src/main/scala/coursier/maven/MavenRepository.scala +++ b/core/shared/src/main/scala/coursier/maven/MavenRepository.scala @@ -287,12 +287,12 @@ final case class MavenRepository( for { str <- fetch(projectArtifact(module, version, versioningValue)) rawListFilesPage <- fetch(artifactFor(listFilesUrl)) - proj <- EitherT(F.point[String \/ Project](parseRawPom(str))) + proj0 <- EitherT(F.point[String \/ Project](parseRawPom(str))) } yield { val files = WebPage.listFiles(listFilesUrl, rawListFilesPage) - val versioning = proj + val versioning = proj0 .snapshotVersioning .flatMap(versioning => mavenVersioning(versioning, "", "") @@ -300,7 +300,7 @@ final case class MavenRepository( val prefix = s"${module.name}-${versioning.getOrElse(version)}" - val packagingTpeMap = proj.packagingOpt + val packagingTpeMap = proj0.packagingOpt .map { packaging => (MavenSource.typeDefaultClassifier(packaging), MavenSource.typeExtension(packaging)) -> packaging } @@ -323,9 +323,14 @@ final case class MavenRepository( ) } + val proj = Pom.addOptionalDependenciesInConfig( + proj0.copy(configurations = defaultConfigurations), + Set("", "compile"), + "optional" + ) + proj.copy( actualVersionOpt = Some(version), - configurations = defaultConfigurations, publications = foundPublications ) } diff --git a/core/shared/src/main/scala/coursier/maven/Pom.scala b/core/shared/src/main/scala/coursier/maven/Pom.scala index b799113d7..cfadb7664 100644 --- a/core/shared/src/main/scala/coursier/maven/Pom.scala +++ b/core/shared/src/main/scala/coursier/maven/Pom.scala @@ -451,4 +451,24 @@ object Pom { } yield modVers :+ modVer } } + + def addOptionalDependenciesInConfig( + proj: Project, + fromConfigs: Set[String], + optionalConfig: String + ): Project = { + + val optionalDeps = proj.dependencies.collect { + case (conf, dep) if dep.optional && fromConfigs(conf) => + optionalConfig -> dep.copy(optional = false) + } + + val configurations = proj.configurations + + (optionalConfig -> (proj.configurations.getOrElse(optionalConfig, Nil) ++ fromConfigs.filter(_.nonEmpty)).distinct) + + proj.copy( + configurations = configurations, + dependencies = proj.dependencies ++ optionalDeps + ) + } } diff --git a/sbt-coursier/src/main/scala-2.10/coursier/Tasks.scala b/sbt-coursier/src/main/scala-2.10/coursier/Tasks.scala index 34768533d..547fa8c70 100644 --- a/sbt-coursier/src/main/scala-2.10/coursier/Tasks.scala +++ b/sbt-coursier/src/main/scala-2.10/coursier/Tasks.scala @@ -1,6 +1,6 @@ package coursier -import java.io.{ OutputStreamWriter, File } +import java.io.{ File, InputStream, OutputStreamWriter } import java.net.URL import java.util.concurrent.{ ExecutorService, Executors } @@ -123,10 +123,14 @@ object Tasks { allDependencies <- allDependenciesTask } yield { + val configMap = configurations + .map { cfg => cfg.name -> cfg.extendsConfigs.map(_.name) } + .toMap + FromSbt.project( projId, allDependencies, - configurations.map { cfg => cfg.name -> cfg.extendsConfigs.map(_.name) }.toMap, + configMap, sv, sbv ) diff --git a/tests/shared/src/test/resources/resolutions/org.scala-lang/scala-compiler/2.11.8 b/tests/shared/src/test/resources/resolutions/org.scala-lang/scala-compiler/2.11.8 new file mode 100644 index 000000000..6de933dc3 --- /dev/null +++ b/tests/shared/src/test/resources/resolutions/org.scala-lang/scala-compiler/2.11.8 @@ -0,0 +1,5 @@ +org.scala-lang:scala-compiler:2.11.8:compile +org.scala-lang:scala-library:2.11.8:compile +org.scala-lang:scala-reflect:2.11.8:compile +org.scala-lang.modules:scala-parser-combinators_2.11:1.0.4:compile +org.scala-lang.modules:scala-xml_2.11:1.0.4:compile \ No newline at end of file diff --git a/tests/shared/src/test/resources/resolutions/org.scala-lang/scala-compiler/2.11.8_optional b/tests/shared/src/test/resources/resolutions/org.scala-lang/scala-compiler/2.11.8_optional new file mode 100644 index 000000000..b73be2e92 --- /dev/null +++ b/tests/shared/src/test/resources/resolutions/org.scala-lang/scala-compiler/2.11.8_optional @@ -0,0 +1,6 @@ +jline:jline:2.12.1:compile +org.scala-lang:scala-compiler:2.11.8:optional +org.scala-lang:scala-library:2.11.8:compile +org.scala-lang:scala-reflect:2.11.8:compile +org.scala-lang.modules:scala-parser-combinators_2.11:1.0.4:compile +org.scala-lang.modules:scala-xml_2.11:1.0.4:compile \ No newline at end of file diff --git a/tests/shared/src/test/scala/coursier/test/CentralTests.scala b/tests/shared/src/test/scala/coursier/test/CentralTests.scala index 8e84ed1bd..49f51f127 100644 --- a/tests/shared/src/test/scala/coursier/test/CentralTests.scala +++ b/tests/shared/src/test/scala/coursier/test/CentralTests.scala @@ -465,6 +465,22 @@ object CentralTests extends TestSuite { "0.5.0" ) } + + 'scalaCompilerJLine - { + + // optional should bring jline + + * - resolutionCheck( + Module("org.scala-lang", "scala-compiler"), + "2.11.8" + ) + + * - resolutionCheck( + Module("org.scala-lang", "scala-compiler"), + "2.11.8", + configuration = "optional" + ) + } } }