Keep global exclusions as such in generated ivy.xml

This commit is contained in:
Alexandre Archambault 2020-05-18 19:27:41 +02:00
parent 3d374247ca
commit 6cebc8fe7a
6 changed files with 38 additions and 12 deletions

View File

@ -123,12 +123,12 @@ object Inputs {
sets.values.toVector.distinct.map(_.set.toSet) sets.values.toVector.distinct.map(_.set.toSet)
} }
def exclusions( def exclusionsSeq(
excludeDeps: Seq[InclExclRule], excludeDeps: Seq[InclExclRule],
sv: String, sv: String,
sbv: String, sbv: String,
log: Logger log: Logger
): Set[(Organization, ModuleName)] = { ): Seq[(Organization, ModuleName)] = {
var anyNonSupportedExclusionRule = false var anyNonSupportedExclusionRule = false
@ -144,7 +144,6 @@ object Inputs {
Seq((Organization(rule.organization), ModuleName(name))) Seq((Organization(rule.organization), ModuleName(name)))
} }
} }
.toSet
if (anyNonSupportedExclusionRule) if (anyNonSupportedExclusionRule)
log.warn("Only supported exclusion rule fields: organization, name") log.warn("Only supported exclusion rule fields: organization, name")
@ -152,6 +151,14 @@ object Inputs {
res 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)] = def forceVersions(depOverrides: Seq[ModuleID], sv: String, sbv: String): Seq[(Module, String)] =
depOverrides.map(FromSbt.moduleVersion(_, sv, sbv)) depOverrides.map(FromSbt.moduleVersion(_, sv, sbv))

View File

@ -3,11 +3,12 @@ package coursier.sbtcoursiershared
import java.nio.charset.StandardCharsets.UTF_8 import java.nio.charset.StandardCharsets.UTF_8
import java.nio.file.Files import java.nio.file.Files
import lmcoursier.Inputs
import lmcoursier.definitions.{Configuration, Project} import lmcoursier.definitions.{Configuration, Project}
import org.apache.ivy.core.module.id.ModuleRevisionId import org.apache.ivy.core.module.id.ModuleRevisionId
import sbt.{Def, Setting, Task, TaskKey} import sbt.{Def, Setting, Task, TaskKey}
import sbt.internal.librarymanagement.IvySbt import sbt.internal.librarymanagement.IvySbt
import sbt.librarymanagement.PublishConfiguration import sbt.librarymanagement.{CrossVersion, PublishConfiguration}
import scala.collection.JavaConverters._ import scala.collection.JavaConverters._
import scala.xml.{Node, PrefixedAttribute} import scala.xml.{Node, PrefixedAttribute}
@ -16,6 +17,7 @@ object IvyXml {
private[sbtcoursiershared] def rawContent( private[sbtcoursiershared] def rawContent(
currentProject: Project, currentProject: Project,
exclusions: Seq[(String, String)],
shadedConfigOpt: Option[Configuration] shadedConfigOpt: Option[Configuration]
): String = { ): String = {
@ -28,12 +30,13 @@ object IvyXml {
val printer = new scala.xml.PrettyPrinter(Int.MaxValue, 2) val printer = new scala.xml.PrettyPrinter(Int.MaxValue, 2)
"""<?xml version="1.0" encoding="UTF-8"?>""" + '\n' + """<?xml version="1.0" encoding="UTF-8"?>""" + '\n' +
printer.format(content(currentProject, shadedConfigOpt)) printer.format(content(currentProject, exclusions, shadedConfigOpt))
} }
// These are required for publish to be fine, later on. // These are required for publish to be fine, later on.
private def writeFiles( private def writeFiles(
currentProject: Project, currentProject: Project,
exclusions: Seq[(String, String)],
shadedConfigOpt: Option[Configuration], shadedConfigOpt: Option[Configuration],
ivySbt: IvySbt, ivySbt: IvySbt,
log: sbt.util.Logger log: sbt.util.Logger
@ -53,7 +56,7 @@ object IvyXml {
val cacheIvyFile = ivyCacheManager.getResolvedIvyFileInCache(ivyModule) val cacheIvyFile = ivyCacheManager.getResolvedIvyFileInCache(ivyModule)
val cacheIvyPropertiesFile = ivyCacheManager.getResolvedIvyPropertiesInCache(ivyModule) val cacheIvyPropertiesFile = ivyCacheManager.getResolvedIvyPropertiesInCache(ivyModule)
val content0 = rawContent(currentProject, shadedConfigOpt) val content0 = rawContent(currentProject, exclusions, shadedConfigOpt)
cacheIvyFile.getParentFile.mkdirs() cacheIvyFile.getParentFile.mkdirs()
log.info(s"Writing Ivy file $cacheIvyFile") log.info(s"Writing Ivy file $cacheIvyFile")
Files.write(cacheIvyFile.toPath, content0.getBytes(UTF_8)) Files.write(cacheIvyFile.toPath, content0.getBytes(UTF_8))
@ -63,7 +66,11 @@ object IvyXml {
Files.write(cacheIvyPropertiesFile.toPath, Array.emptyByteArray) 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 = val filterOutDependencies =
shadedConfigOpt.toSet[Configuration].flatMap { shadedConfig => shadedConfigOpt.toSet[Configuration].flatMap { shadedConfig =>
@ -148,11 +155,16 @@ object IvyXml {
n % moduleAttrs n % moduleAttrs
} }
val excludeElems = exclusions.toVector.map {
case (org, name) =>
<exclude org={org} module={name} artifact="*" type="*" ext="*" matcher="exact"/>
}
<ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra"> <ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
{infoElem} {infoElem}
<configurations>{confElems}</configurations> <configurations>{confElems}</configurations>
<publications>{publicationElems}</publications> <publications>{publicationElems}</publications>
<dependencies>{dependencyElems}</dependencies> <dependencies>{dependencyElems}{excludeElems}</dependencies>
</ivy-module> </ivy-module>
} }
@ -166,12 +178,20 @@ object IvyXml {
val doGen = coursierGenerateIvyXml.value val doGen = coursierGenerateIvyXml.value
if (doGen) if (doGen)
Def.task { Def.task {
val sv = sbt.Keys.scalaVersion.value
val sbv = sbt.Keys.scalaBinaryVersion.value
val log = sbt.Keys.streams.value.log
val currentProject = { val currentProject = {
val proj = coursierProject.value val proj = coursierProject.value
val publications = coursierPublications.value val publications = coursierPublications.value
proj.withPublications(publications) 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 else
Def.task(()) Def.task(())

View File

@ -21,7 +21,7 @@ object IvyXmlTests extends TestSuite {
Info("", "", Nil, Nil, None) Info("", "", Nil, Nil, None)
) )
val content = IvyXml.rawContent(project, None) val content = IvyXml.rawContent(project, Nil, None)
assert(!content.contains("</conf>")) assert(!content.contains("</conf>"))
} }

View File

@ -3,5 +3,4 @@
$ exec java -jar coursier launch io.get-coursier.test:sbt-coursier-exclude-dependencies_2.12:0.1.0-SNAPSHOT $ exec java -jar coursier launch io.get-coursier.test:sbt-coursier-exclude-dependencies_2.12:0.1.0-SNAPSHOT
> b/run > b/run
> b/publishLocal > 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