diff --git a/ivy/MakePom.scala b/ivy/MakePom.scala index 939ee92bb..76d891330 100644 --- a/ivy/MakePom.scala +++ b/ivy/MakePom.scala @@ -9,6 +9,7 @@ package sbt; import java.io.{BufferedWriter, File, OutputStreamWriter, FileOutputStream} import scala.xml.{Node => XNode, NodeSeq, PrettyPrinter, XML} +import Configurations.Optional import org.apache.ivy.{core, plugins, Ivy} import core.settings.IvySettings @@ -123,32 +124,37 @@ class MakePom {mrid.getOrganisation} {mrid.getName} {mrid.getRevision} - { scope(dependency)} - { optional(dependency) } + { scopeAndOptional(dependency)} } - def scope(dependency: DependencyDescriptor): NodeSeq = - scope(getScope(dependency.getModuleConfigurations)) - def scope(scope: String): NodeSeq = if(scope ne null) {scope} else NodeSeq.Empty - def optional(dependency: DependencyDescriptor) = - if(isOptional(dependency.getModuleConfigurations)) true else NodeSeq.Empty + def scopeAndOptional(dependency: DependencyDescriptor): NodeSeq = + { + val (scope, opt) = getScopeAndOptional(dependency.getModuleConfigurations) + scopeElem(scope) ++ optionalElem(opt) + } + def scopeElem(scope: Option[String]): NodeSeq = scope match { + case Some(s) => {s} + case None => NodeSeq.Empty + } + def optionalElem(opt: Boolean) = if(opt) true else NodeSeq.Empty def moduleDescriptor(module: ModuleDescriptor) = module.getModuleRevisionId - def getScope(confs: Array[String]) = + def getScopeAndOptional(confs: Array[String]): (Option[String], Boolean) = { - Configurations.defaultMavenConfigurations.find(conf => confs.contains(conf.name)) match + val (opt, notOptional) = confs.partition(_ == Optional.name) + val defaultNotOptional = Configurations.defaultMavenConfigurations.find(notOptional contains _.name) + val scope = defaultNotOptional match { - case Some(conf) => conf.name + case Some(conf) => Some(conf.name) case None => - if(confs.isEmpty || confs(0) == Configurations.Default.name) - null + if(notOptional.isEmpty || notOptional(0) == Configurations.Default.name) + None else - confs(0) + Option(notOptional(0)) } + (scope, !opt.isEmpty) } - def isOptional(confs: Array[String]) = confs.isEmpty || (confs.length == 1 && confs(0) == Configurations.Optional.name) - def makeRepositories(settings: IvySettings, includeAll: Boolean, filterRepositories: MavenRepository => Boolean) = { diff --git a/sbt/src/sbt-test/dependency-management/pom-scope/project/PomTest.scala b/sbt/src/sbt-test/dependency-management/pom-scope/project/PomTest.scala new file mode 100644 index 000000000..a8a1a9404 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/pom-scope/project/PomTest.scala @@ -0,0 +1,45 @@ +import sbt._ +import Keys._ + +object PomTest extends Build +{ + lazy val custom = config("custom") + lazy val root = Project("root", file("root")) configs(custom) settings( + TaskKey[Unit]("check-pom") <<= checkPom, + libraryDependencies ++= Seq( + "a" % "a" % "1.0", + "b" % "b" % "1.0" % "runtime,optional", + "c" % "c" % "1.0" % "optional", + "d" % "d" % "1.0" % "test", + "e" % "e" % "1.0" % "custom", + "f" % "f" % "1.0" % "custom,optional,runtime", + "g" % "g" % "1.0" % "custom,runtime" + ) + ) + + + + def checkPom = makePom map { pom => + val expected = Seq( + ("a", Some("compile"), false), + ("b", Some("runtime"), true), + ("c", None, true), + ("d", Some("test"), false), + ("e", Some("custom"), false), + ("f", Some("runtime"), true), + ("g", Some("runtime"), false) + ) + val loaded = xml.XML.loadFile(pom) + val deps = loaded \\ "dependency" + expected foreach { case (id, scope, opt) => + val dep = deps.find(d => (d \ "artifactId").text == id).getOrElse( error("Dependency '" + id + "' not written to pom:\n" + loaded)) + + val actualOpt = java.lang.Boolean.parseBoolean( (dep \\ "optional").text ) + println("Actual: " + actualOpt + ", opt: " + opt) + assert(opt == actualOpt, "Invalid 'optional' section '" + (dep \\ "optional") + "', expected optional=" + opt) + + val actualScope = (dep \\ "scope") match { case Seq() => None; case x => Some(x.text) } + assert(actualScope == scope, "Invalid 'scope' section '" + (dep \\ "scope") + "', expected scope=" + scope) + } + } +} \ No newline at end of file diff --git a/sbt/src/sbt-test/dependency-management/pom-scope/test b/sbt/src/sbt-test/dependency-management/pom-scope/test new file mode 100644 index 000000000..c8edbfbcd --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/pom-scope/test @@ -0,0 +1 @@ +> check-pom \ No newline at end of file