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