diff --git a/modules/lm-coursier/src/main/scala/lmcoursier/Inputs.scala b/modules/lm-coursier/src/main/scala/lmcoursier/Inputs.scala index a88fae0bf..da55d13b8 100644 --- a/modules/lm-coursier/src/main/scala/lmcoursier/Inputs.scala +++ b/modules/lm-coursier/src/main/scala/lmcoursier/Inputs.scala @@ -123,12 +123,12 @@ object Inputs { sets.values.toVector.distinct.map(_.set.toSet) } - def exclusions( + def exclusionsSeq( excludeDeps: Seq[InclExclRule], sv: String, sbv: String, log: Logger - ): Set[(Organization, ModuleName)] = { + ): Seq[(Organization, ModuleName)] = { var anyNonSupportedExclusionRule = false @@ -144,7 +144,6 @@ object Inputs { Seq((Organization(rule.organization), ModuleName(name))) } } - .toSet if (anyNonSupportedExclusionRule) log.warn("Only supported exclusion rule fields: organization, name") @@ -152,6 +151,14 @@ object Inputs { res } + def exclusions( + excludeDeps: Seq[InclExclRule], + sv: String, + sbv: String, + log: Logger + ): Set[(Organization, ModuleName)] = + exclusionsSeq(excludeDeps, sv, sbv, log).toSet + def forceVersions(depOverrides: Seq[ModuleID], sv: String, sbv: String): Seq[(Module, String)] = depOverrides.map(FromSbt.moduleVersion(_, sv, sbv)) diff --git a/modules/sbt-coursier-shared/src/main/scala/coursier/sbtcoursiershared/IvyXml.scala b/modules/sbt-coursier-shared/src/main/scala/coursier/sbtcoursiershared/IvyXml.scala index 5b9d614dd..9369a42fd 100644 --- a/modules/sbt-coursier-shared/src/main/scala/coursier/sbtcoursiershared/IvyXml.scala +++ b/modules/sbt-coursier-shared/src/main/scala/coursier/sbtcoursiershared/IvyXml.scala @@ -3,11 +3,12 @@ package coursier.sbtcoursiershared import java.nio.charset.StandardCharsets.UTF_8 import java.nio.file.Files +import lmcoursier.Inputs import lmcoursier.definitions.{Configuration, Project} import org.apache.ivy.core.module.id.ModuleRevisionId import sbt.{Def, Setting, Task, TaskKey} import sbt.internal.librarymanagement.IvySbt -import sbt.librarymanagement.PublishConfiguration +import sbt.librarymanagement.{CrossVersion, PublishConfiguration} import scala.collection.JavaConverters._ import scala.xml.{Node, PrefixedAttribute} @@ -16,6 +17,7 @@ object IvyXml { private[sbtcoursiershared] def rawContent( currentProject: Project, + exclusions: Seq[(String, String)], shadedConfigOpt: Option[Configuration] ): String = { @@ -28,12 +30,13 @@ object IvyXml { val printer = new scala.xml.PrettyPrinter(Int.MaxValue, 2) """""" + '\n' + - printer.format(content(currentProject, shadedConfigOpt)) + printer.format(content(currentProject, exclusions, shadedConfigOpt)) } // These are required for publish to be fine, later on. private def writeFiles( currentProject: Project, + exclusions: Seq[(String, String)], shadedConfigOpt: Option[Configuration], ivySbt: IvySbt, log: sbt.util.Logger @@ -53,7 +56,7 @@ object IvyXml { val cacheIvyFile = ivyCacheManager.getResolvedIvyFileInCache(ivyModule) val cacheIvyPropertiesFile = ivyCacheManager.getResolvedIvyPropertiesInCache(ivyModule) - val content0 = rawContent(currentProject, shadedConfigOpt) + val content0 = rawContent(currentProject, exclusions, shadedConfigOpt) cacheIvyFile.getParentFile.mkdirs() log.info(s"Writing Ivy file $cacheIvyFile") Files.write(cacheIvyFile.toPath, content0.getBytes(UTF_8)) @@ -63,7 +66,11 @@ object IvyXml { Files.write(cacheIvyPropertiesFile.toPath, Array.emptyByteArray) } - private def content(project0: Project, shadedConfigOpt: Option[Configuration]): Node = { + private def content( + project0: Project, + exclusions: Seq[(String, String)], + shadedConfigOpt: Option[Configuration] + ): Node = { val filterOutDependencies = shadedConfigOpt.toSet[Configuration].flatMap { shadedConfig => @@ -148,11 +155,16 @@ object IvyXml { n % moduleAttrs } + val excludeElems = exclusions.toVector.map { + case (org, name) => + + } + {infoElem} {confElems} {publicationElems} - {dependencyElems} + {dependencyElems}{excludeElems} } @@ -166,12 +178,20 @@ object IvyXml { val doGen = coursierGenerateIvyXml.value if (doGen) Def.task { + val sv = sbt.Keys.scalaVersion.value + val sbv = sbt.Keys.scalaBinaryVersion.value + val log = sbt.Keys.streams.value.log val currentProject = { val proj = coursierProject.value val publications = coursierPublications.value proj.withPublications(publications) } - writeFiles(currentProject, shadedConfigOpt, sbt.Keys.ivySbt.value, sbt.Keys.streams.value.log) + val excludeDeps = Inputs.exclusionsSeq(InputsTasks.actualExcludeDependencies.value, sv, sbv, log) + .map { + case (org, name) => + (org.value, name.value) + } + writeFiles(currentProject, excludeDeps, shadedConfigOpt, sbt.Keys.ivySbt.value, log) } else Def.task(()) diff --git a/modules/sbt-coursier-shared/src/test/scala/coursier/sbtcoursiershared/IvyXmlTests.scala b/modules/sbt-coursier-shared/src/test/scala/coursier/sbtcoursiershared/IvyXmlTests.scala index 6a460e0be..3085d849a 100644 --- a/modules/sbt-coursier-shared/src/test/scala/coursier/sbtcoursiershared/IvyXmlTests.scala +++ b/modules/sbt-coursier-shared/src/test/scala/coursier/sbtcoursiershared/IvyXmlTests.scala @@ -21,7 +21,7 @@ object IvyXmlTests extends TestSuite { Info("", "", Nil, Nil, None) ) - val content = IvyXml.rawContent(project, None) + val content = IvyXml.rawContent(project, Nil, None) assert(!content.contains("")) } diff --git a/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/coursier b/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/coursier index 6cada6f8b..1153c1797 100755 Binary files a/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/coursier and b/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/coursier differ diff --git a/modules/sbt-coursier/src/sbt-test/shared-1/exclude-dependencies/coursier b/modules/sbt-coursier/src/sbt-test/shared-1/exclude-dependencies/coursier index 6cada6f8b..eb1b55198 100755 Binary files a/modules/sbt-coursier/src/sbt-test/shared-1/exclude-dependencies/coursier and b/modules/sbt-coursier/src/sbt-test/shared-1/exclude-dependencies/coursier differ diff --git a/modules/sbt-coursier/src/sbt-test/shared-1/exclude-dependencies/test b/modules/sbt-coursier/src/sbt-test/shared-1/exclude-dependencies/test index 9eee79a6c..11d45a4a2 100644 --- a/modules/sbt-coursier/src/sbt-test/shared-1/exclude-dependencies/test +++ b/modules/sbt-coursier/src/sbt-test/shared-1/exclude-dependencies/test @@ -3,5 +3,4 @@ $ exec java -jar coursier launch io.get-coursier.test:sbt-coursier-exclude-dependencies_2.12:0.1.0-SNAPSHOT > b/run > b/publishLocal -# doesn't pass yet (missing exclusions of root deps in ivy.xml?) -# $ exec java -jar coursier launch io.get-coursier.test:sbt-coursier-exclude-dependencies-2_2.12:0.1.0-SNAPSHOT +$ exec java -jar coursier launch io.get-coursier.test:sbt-coursier-exclude-dependencies-2_2.12:0.1.0-SNAPSHOT