From 827d0011ed1f6e59600c72250466da1e0387c349 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Thu, 28 May 2015 08:14:08 +0100 Subject: [PATCH 1/5] Add project-level exclusions in the POM. Closes #1877. --- ivy/src/main/scala/sbt/MakePom.scala | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ivy/src/main/scala/sbt/MakePom.scala b/ivy/src/main/scala/sbt/MakePom.scala index 16bd6002a..ffd189932 100644 --- a/ivy/src/main/scala/sbt/MakePom.scala +++ b/ivy/src/main/scala/sbt/MakePom.scala @@ -104,7 +104,7 @@ class MakePom(val log: Logger) { { val deps = depsInConfs(module, configurations) makeProperties(module, deps) ++ - makeDependencies(deps, includeTypes) + makeDependencies(deps, includeTypes, module.getAllExcludeRules) } { makeRepositories(ivy.getSettings, allRepositories, filterRepositories) } ) @@ -220,15 +220,15 @@ class MakePom(val log: Logger) { } val IgnoreTypes: Set[String] = Set(Artifact.SourceType, Artifact.DocType, Artifact.PomType) - def makeDependencies(dependencies: Seq[DependencyDescriptor], includeTypes: Set[String]): NodeSeq = + def makeDependencies(dependencies: Seq[DependencyDescriptor], includeTypes: Set[String], excludes: Seq[ExcludeRule]): NodeSeq = if (dependencies.isEmpty) NodeSeq.Empty else - { dependencies.map(makeDependency(_, includeTypes)) } + { dependencies.map(makeDependency(_, includeTypes, excludes)) } - def makeDependency(dependency: DependencyDescriptor, includeTypes: Set[String]): NodeSeq = + def makeDependency(dependency: DependencyDescriptor, includeTypes: Set[String], excludes: Seq[ExcludeRule]): NodeSeq = { val artifacts = dependency.getAllDependencyArtifacts val includeArtifacts = artifacts.filter(d => includeTypes(d.getType)) @@ -236,15 +236,15 @@ class MakePom(val log: Logger) { val configs = dependency.getModuleConfigurations if (configs.filterNot(Set("sources","docs")).nonEmpty) { val (scope, optional) = getScopeAndOptional(dependency.getModuleConfigurations) - makeDependencyElem(dependency, scope, optional, None, None) + makeDependencyElem(dependency, scope, optional, None, None, excludes) } else NodeSeq.Empty } else if (includeArtifacts.isEmpty) NodeSeq.Empty else - NodeSeq.fromSeq(artifacts.flatMap(a => makeDependencyElem(dependency, a))) + NodeSeq.fromSeq(artifacts.flatMap(a => makeDependencyElem(dependency, a, excludes))) } - def makeDependencyElem(dependency: DependencyDescriptor, artifact: DependencyArtifactDescriptor): Option[Elem] = + def makeDependencyElem(dependency: DependencyDescriptor, artifact: DependencyArtifactDescriptor, excludes: Seq[ExcludeRule]): Option[Elem] = { val configs = artifact.getConfigurations.toList match { case Nil | "*" :: Nil => dependency.getModuleConfigurations @@ -258,10 +258,10 @@ class MakePom(val log: Logger) { case (Some(c), Some(tpe)) if Artifact.classifierType(c) == tpe => None case _ => baseType } - Some(makeDependencyElem(dependency, scope, optional, classifier, tpe)) + Some(makeDependencyElem(dependency, scope, optional, classifier, tpe, excludes)) } else None } - def makeDependencyElem(dependency: DependencyDescriptor, scope: Option[String], optional: Boolean, classifier: Option[String], tpe: Option[String]): Elem = + def makeDependencyElem(dependency: DependencyDescriptor, scope: Option[String], optional: Boolean, classifier: Option[String], tpe: Option[String], excludes: Seq[ExcludeRule]): Elem = { val mrid = dependency.getDependencyRevisionId @@ -272,7 +272,7 @@ class MakePom(val log: Logger) { { optionalElem(optional) } { classifierElem(classifier) } { typeElem(tpe) } - { exclusions(dependency) } + { exclusions(dependency, excludes) } } @@ -322,9 +322,9 @@ class MakePom(val log: Logger) { (scope, opt.nonEmpty) } - def exclusions(dependency: DependencyDescriptor): NodeSeq = + def exclusions(dependency: DependencyDescriptor, excludes: Seq[ExcludeRule]): NodeSeq = { - val excl = dependency.getExcludeRules(dependency.getModuleConfigurations) + val excl = dependency.getExcludeRules(dependency.getModuleConfigurations) ++ excludes val (warns, excls) = IvyUtil.separate(excl.map(makeExclusion)) if (warns.nonEmpty) log.warn(warns.mkString(IO.Newline)) if (excls.nonEmpty) { excls } From 4be663191eab7d4cb08917ae065154a881420a78 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Sun, 24 May 2015 21:55:10 +0100 Subject: [PATCH 2/5] Add a group+artifact test for excludeDependencies. --- .../exclude-dependencies/build.sbt | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/sbt/src/sbt-test/dependency-management/exclude-dependencies/build.sbt b/sbt/src/sbt-test/dependency-management/exclude-dependencies/build.sbt index 16bc85772..5390886f3 100644 --- a/sbt/src/sbt-test/dependency-management/exclude-dependencies/build.sbt +++ b/sbt/src/sbt-test/dependency-management/exclude-dependencies/build.sbt @@ -1,3 +1,6 @@ +import scala.xml.{ Node, _ } +import scala.xml.Utility.trim + lazy val check = taskKey[Unit]("check") val dispatch = "net.databinder.dispatch" %% "dispatch-core" % "0.11.2" @@ -31,5 +34,30 @@ lazy val root = (project in file(".")). if (bcp exists { _.data.getName contains "dispatch-core_2.11-0.11.1.jar" }) { sys.error("dispatch-core_2.11-0.11.1.jar found when it should NOT be included: " + bcp.toString) } + + val bPomXml = makePomXml(streams.value.log, (makePomConfiguration in b).value, (ivyModule in b).value) + + val repatchTwitterXml = bPomXml \ "dependencies" \ "dependency" find { d => + (d \ "groupId").text == "com.eed3si9n" && (d \ "artifactId").text == "repatch-twitter-core_2.11" + } getOrElse (sys error s"Missing repatch-twitter-core dependency: $bPomXml") + + val excludeDispatchCoreXml = + + net.databinder.dispatch + dispatch-core_2.11 + + + if (trim((repatchTwitterXml \ "exclusions" \ "exclusion").head) != trim(excludeDispatchCoreXml)) + sys error s"Missing dispatch-core exclusion: $repatchTwitterXml" + + () } - ) \ No newline at end of file + ) + +def makePomXml(log: Logger, makePomConfig: MakePomConfiguration, ivyModule: IvySbt#Module): Node = { + ivyModule.withModule[Node](log) { (ivy, md, default) => + import makePomConfig._ + new MakePom(log).toPom( + ivy, md, moduleInfo, configurations, includeTypes, extra, filterRepositories, allRepositories) + } +} From 87455f369d139309cf1da092e1d5fc8c08e905a5 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Tue, 26 May 2015 23:25:08 +0100 Subject: [PATCH 3/5] Fix bincompat for project-level excludes in the POM. --- ivy/src/main/scala/sbt/MakePom.scala | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/ivy/src/main/scala/sbt/MakePom.scala b/ivy/src/main/scala/sbt/MakePom.scala index ffd189932..4e0ed0118 100644 --- a/ivy/src/main/scala/sbt/MakePom.scala +++ b/ivy/src/main/scala/sbt/MakePom.scala @@ -220,6 +220,10 @@ class MakePom(val log: Logger) { } val IgnoreTypes: Set[String] = Set(Artifact.SourceType, Artifact.DocType, Artifact.PomType) + @deprecated("Use `makeDependencies` variant which takes excludes", "0.13.9") + def makeDependencies(dependencies: Seq[DependencyDescriptor], includeTypes: Set[String]): NodeSeq = + makeDependencies(dependencies, includeTypes, Nil) + def makeDependencies(dependencies: Seq[DependencyDescriptor], includeTypes: Set[String], excludes: Seq[ExcludeRule]): NodeSeq = if (dependencies.isEmpty) NodeSeq.Empty @@ -228,6 +232,10 @@ class MakePom(val log: Logger) { { dependencies.map(makeDependency(_, includeTypes, excludes)) } + @deprecated("Use `makeDependency` variant which takes excludes", "0.13.9") + def makeDependency(dependency: DependencyDescriptor, includeTypes: Set[String]): NodeSeq = + makeDependency(dependency, includeTypes, Nil) + def makeDependency(dependency: DependencyDescriptor, includeTypes: Set[String], excludes: Seq[ExcludeRule]): NodeSeq = { val artifacts = dependency.getAllDependencyArtifacts @@ -244,6 +252,10 @@ class MakePom(val log: Logger) { NodeSeq.fromSeq(artifacts.flatMap(a => makeDependencyElem(dependency, a, excludes))) } + @deprecated("Use `makeDependencyElem` variant which takes excludes", "0.13.9") + def makeDependencyElem(dependency: DependencyDescriptor, artifact: DependencyArtifactDescriptor): Option[Elem] = + makeDependencyElem(dependency, artifact, Nil) + def makeDependencyElem(dependency: DependencyDescriptor, artifact: DependencyArtifactDescriptor, excludes: Seq[ExcludeRule]): Option[Elem] = { val configs = artifact.getConfigurations.toList match { @@ -261,6 +273,11 @@ class MakePom(val log: Logger) { Some(makeDependencyElem(dependency, scope, optional, classifier, tpe, excludes)) } else None } + + @deprecated("Use `makeDependencyElem` variant which takes excludes", "0.13.9") + def makeDependencyElem(dependency: DependencyDescriptor, scope: Option[String], optional: Boolean, classifier: Option[String], tpe: Option[String]): Elem = + makeDependencyElem(dependency, scope, optional, classifier, tpe, Nil) + def makeDependencyElem(dependency: DependencyDescriptor, scope: Option[String], optional: Boolean, classifier: Option[String], tpe: Option[String], excludes: Seq[ExcludeRule]): Elem = { val mrid = dependency.getDependencyRevisionId @@ -322,6 +339,9 @@ class MakePom(val log: Logger) { (scope, opt.nonEmpty) } + @deprecated("Use `exclusions` variant which takes excludes", "0.13.9") + def exclusions(dependency: DependencyDescriptor): NodeSeq = exclusions(dependency, Nil) + def exclusions(dependency: DependencyDescriptor, excludes: Seq[ExcludeRule]): NodeSeq = { val excl = dependency.getExcludeRules(dependency.getModuleConfigurations) ++ excludes From bbfbdde427e0c8ea3de64c7325ebc0b7919df6a6 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Tue, 26 May 2015 23:34:33 +0100 Subject: [PATCH 4/5] Add notes for project-level excludes in the POM. --- .../project-level-exclusions-in-the-pom.markdown | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 notes/0.13.9/project-level-exclusions-in-the-pom.markdown diff --git a/notes/0.13.9/project-level-exclusions-in-the-pom.markdown b/notes/0.13.9/project-level-exclusions-in-the-pom.markdown new file mode 100644 index 000000000..f534d989e --- /dev/null +++ b/notes/0.13.9/project-level-exclusions-in-the-pom.markdown @@ -0,0 +1,12 @@ + + [@dwijnand]: http://github.com/dwijnand + [#1877]: https://github.com/sbt/sbt/issues/1877 + [#2035]: https://github.com/sbt/sbt/pull/2035 + +### Fixes with compatibility implications + +### Improvements + +### Bug fixes + +- Add dependency-level exclusions in the POM for project-level exclusions. [#1877][]/[#2035][] by [@dwijnand][] From c47b28c0d9b1c007b70904e85f2e279c5b94acc1 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Thu, 28 May 2015 08:27:55 +0100 Subject: [PATCH 5/5] Commit build auto-formatting changes for code in master. --- ivy/src/main/scala/sbt/MakePom.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ivy/src/main/scala/sbt/MakePom.scala b/ivy/src/main/scala/sbt/MakePom.scala index 4e0ed0118..1dfa5d1fe 100644 --- a/ivy/src/main/scala/sbt/MakePom.scala +++ b/ivy/src/main/scala/sbt/MakePom.scala @@ -242,7 +242,7 @@ class MakePom(val log: Logger) { val includeArtifacts = artifacts.filter(d => includeTypes(d.getType)) if (artifacts.isEmpty) { val configs = dependency.getModuleConfigurations - if (configs.filterNot(Set("sources","docs")).nonEmpty) { + if (configs.filterNot(Set("sources", "docs")).nonEmpty) { val (scope, optional) = getScopeAndOptional(dependency.getModuleConfigurations) makeDependencyElem(dependency, scope, optional, None, None, excludes) } else NodeSeq.Empty @@ -262,7 +262,7 @@ class MakePom(val log: Logger) { case Nil | "*" :: Nil => dependency.getModuleConfigurations case x => x.toArray } - if (configs.filterNot(Set("sources","docs")).nonEmpty) { + if (configs.filterNot(Set("sources", "docs")).nonEmpty) { val (scope, optional) = getScopeAndOptional(configs) val classifier = artifactClassifier(artifact) val baseType = artifactType(artifact)