diff --git a/ivy/Ivy.scala b/ivy/Ivy.scala
index 76f88b1d2..58d495237 100644
--- a/ivy/Ivy.scala
+++ b/ivy/Ivy.scala
@@ -343,4 +343,10 @@ private object IvySbt
case dmd: DefaultModuleDescriptor => dmd
case _ => error("Unknown ModuleDescriptor type.")
}
+ def getConfigurations(module: ModuleDescriptor, configurations: Option[Iterable[Configuration]]) =
+ configurations match
+ {
+ case Some(confs) => confs.map(_.name).toList.toArray
+ case None => module.getPublicConfigurationsNames
+ }
}
diff --git a/ivy/IvyActions.scala b/ivy/IvyActions.scala
index f034e7cfa..c937f252f 100644
--- a/ivy/IvyActions.scala
+++ b/ivy/IvyActions.scala
@@ -49,8 +49,7 @@ object IvyActions
{
module.withModule { (ivy, md, default) =>
addLateDependencies(ivy, md, default, extraDependencies)
- val pomModule = keepConfigurations(md, configurations)
- (new MakePom).write(ivy, pomModule, extra, output)
+ (new MakePom).write(ivy, md, configurations, extra, output)
module.logger.info("Wrote " + output.getAbsolutePath)
}
}
@@ -61,32 +60,6 @@ object IvyActions
parser.setMd(module)
IvySbt.addDependencies(module, extraDependencies, parser)
}
- private def getConfigurations(module: ModuleDescriptor, configurations: Option[Iterable[Configuration]]) =
- configurations match
- {
- case Some(confs) => confs.map(_.name).toList.toArray
- case None => module.getPublicConfigurationsNames
- }
- /** Retain dependencies only with the configurations given, or all public configurations of `module` if `configurations` is None.
- * This currently only preserves the information required by makePom*/
- private def keepConfigurations(module: ModuleDescriptor, configurations: Option[Iterable[Configuration]]): ModuleDescriptor =
- {
- val keepConfigurations = getConfigurations(module, configurations)
- val keepSet = Set(keepConfigurations.toSeq : _*)
- def translate(dependency: DependencyDescriptor) =
- {
- val keep = dependency.getModuleConfigurations.filter(keepSet.contains)
- if(keep.isEmpty)
- None
- else // TODO: translate the dependency to contain only configurations to keep
- Some(dependency)
- }
- val newModule = new DefaultModuleDescriptor(module.getModuleRevisionId, "", null)
- newModule.setHomePage(module.getHomePage)
- for(dependency <- module.getDependencies; translated <- translate(dependency))
- newModule.addDependency(translated)
- newModule
- }
def deliver(module: IvySbt#Module, status: String, deliverIvyPattern: String, extraDependencies: Iterable[ModuleID], configurations: Option[Iterable[Configuration]], quiet: Boolean)
{
@@ -95,7 +68,7 @@ object IvyActions
resolve(quiet)(ivy, md, default) // todo: set download = false for resolve
val revID = md.getModuleRevisionId
val options = DeliverOptions.newInstance(ivy.getSettings).setStatus(status)
- options.setConfs(getConfigurations(md, configurations))
+ options.setConfs(IvySbt.getConfigurations(md, configurations))
ivy.deliver(revID, revID.getRevision, deliverIvyPattern, options)
}
}
@@ -108,7 +81,7 @@ object IvyActions
srcArtifactPatterns.foreach(pattern => patterns.add(pattern))
val options = (new PublishOptions).setOverwrite(true)
deliveredIvyPattern.foreach(options.setSrcIvyPattern)
- options.setConfs(getConfigurations(md, configurations))
+ options.setConfs(IvySbt.getConfigurations(md, configurations))
ivy.publish(revID, patterns, resolverName, options)
}
}
diff --git a/ivy/MakePom.scala b/ivy/MakePom.scala
index c59347160..0670ae853 100644
--- a/ivy/MakePom.scala
+++ b/ivy/MakePom.scala
@@ -20,7 +20,8 @@ import plugins.resolver.{ChainResolver, DependencyResolver, IBiblioResolver}
class MakePom
{
def encoding = "UTF-8"
- def write(ivy: Ivy, module: ModuleDescriptor, extra: NodeSeq, output: File): Unit = write(toPom(ivy, module, extra), output)
+ def write(ivy: Ivy, module: ModuleDescriptor, configurations: Option[Iterable[Configuration]], extra: NodeSeq, output: File): Unit =
+ write(toPom(ivy, module, configurations, extra), output)
def write(node: Node, output: File): Unit = write(toString(node), output)
def write(xmlString: String, output: File)
{
@@ -36,12 +37,12 @@ class MakePom
}
def toString(node: Node): String = new PrettyPrinter(1000, 4).format(node)
- def toPom(ivy: Ivy, module: ModuleDescriptor, extra: NodeSeq): Node =
+ def toPom(ivy: Ivy, module: ModuleDescriptor, configurations: Option[Iterable[Configuration]], extra: NodeSeq): Node =
(
4.0.0
{ makeModuleID(module) }
{ extra }
- { makeDependencies(module) }
+ { makeDependencies(module, configurations) }
{ makeRepositories(ivy.getSettings) }
)
@@ -51,7 +52,7 @@ class MakePom
val a: NodeSeq =
({ mrid.getOrganisation }
{ mrid.getName }
- { packaging(mrid) })
+ { packaging(module) })
val b: NodeSeq =
( (description(module.getDescription) ++
homePage(module.getHomePage) ++
@@ -70,11 +71,19 @@ class MakePom
def homePage(homePage: String) = if(homePage eq null) NodeSeq.Empty else {homePage}
def revision(version: String) = if(version ne null) {version} else NodeSeq.Empty
- def packaging(module: ModuleRevisionId) = "jar"//module.getDefaultArtifact.getExt
+ def packaging(module: ModuleDescriptor) =
+ module.getAllArtifacts match
+ {
+ case Array() => "pom"
+ case Array(x) => x.getType
+ case xs =>
+ val notpom = xs.filter(_.getType != "pom")
+ if(notpom.isEmpty) "pom" else notpom(0).getType
+ }
- def makeDependencies(module: ModuleDescriptor): NodeSeq =
+ def makeDependencies(module: ModuleDescriptor, configurations: Option[Iterable[Configuration]]): NodeSeq =
{
- val dependencies = module.getDependencies
+ val dependencies = depsInConfs(module, configurations)
if(dependencies.isEmpty) NodeSeq.Empty
else
@@ -147,4 +156,21 @@ class MakePom
{name}
{root}
-}
+
+ /** Retain dependencies only with the configurations given, or all public configurations of `module` if `configurations` is None.
+ * This currently only preserves the information required by makePom*/
+ private def depsInConfs(module: ModuleDescriptor, configurations: Option[Iterable[Configuration]]): Seq[DependencyDescriptor] =
+ {
+ val keepConfigurations = IvySbt.getConfigurations(module, configurations)
+ val keepSet = Set(keepConfigurations.toSeq : _*)
+ def translate(dependency: DependencyDescriptor) =
+ {
+ val keep = dependency.getModuleConfigurations.filter(keepSet.contains)
+ if(keep.isEmpty)
+ None
+ else // TODO: translate the dependency to contain only configurations to keep
+ Some(dependency)
+ }
+ module.getDependencies flatMap translate
+ }
+}
\ No newline at end of file
diff --git a/project/build/SbtProject.scala b/project/build/SbtProject.scala
index b56239059..0a9b1b9c2 100644
--- a/project/build/SbtProject.scala
+++ b/project/build/SbtProject.scala
@@ -6,7 +6,7 @@ import sbt._
import java.io.File
import java.net.URL
-abstract class SbtProject(info: ProjectInfo) extends DefaultProject(info) with test.SbtScripted with posterous.Publish with Sxr
+abstract class SbtProject(info: ProjectInfo) extends DefaultProject(info) with test.SbtScripted with posterous.Publish// with Sxr
{
/* Additional resources to include in the produced jar.*/
def extraResources = descendents(info.projectPath / "licenses", "*") +++ "LICENSE" +++ "NOTICE"
@@ -46,6 +46,7 @@ abstract class SbtProject(info: ProjectInfo) extends DefaultProject(info) with t
val testInterface = "org.scala-tools.testing" % "test-interface" % "0.5"
+ def deepSources = Path.finder { topologicalSort.flatMap { case p: ScalaPaths => p.mainSources.getFiles } }
lazy val sbtDoc = scaladocTask("sbt", deepSources, docPath, docClasspath, documentOptions)
/* For generating JettyRun for Jetty 6 and 7. The only difference is the imports, but the file has to be compiled against each set of imports. */
diff --git a/sbt/src/sbt-test/dependency-management/pom-packaging/project/build.properties b/sbt/src/sbt-test/dependency-management/pom-packaging/project/build.properties
new file mode 100644
index 000000000..1dde45e89
--- /dev/null
+++ b/sbt/src/sbt-test/dependency-management/pom-packaging/project/build.properties
@@ -0,0 +1,2 @@
+project.name=Pom Test
+project.version=1.0
\ No newline at end of file
diff --git a/sbt/src/sbt-test/dependency-management/pom-packaging/project/build/PomTest.scala b/sbt/src/sbt-test/dependency-management/pom-packaging/project/build/PomTest.scala
new file mode 100644
index 000000000..c3bdaec5c
--- /dev/null
+++ b/sbt/src/sbt-test/dependency-management/pom-packaging/project/build/PomTest.scala
@@ -0,0 +1,21 @@
+import sbt._
+
+class PomTest(info: ProjectInfo) extends ParentProject(info) with BasicManagedProject
+{
+ val subJar = project("subJar", "Sub Jar", new DefaultProject(_))
+ val subWar = project("subWar", "Sub War", new DefaultWebProject(_))
+ val subParent = project("subParent", "Sub Parent", i => new ParentProject(i) with BasicManagedProject)
+
+ def readPom(path: Path) = xml.XML.loadFile(path.asFile)
+ lazy val checkPom = task {
+ checkPackaging(subJar.pomPath, "jar") orElse
+ checkPackaging(subWar.pomPath, "war") orElse
+ checkPackaging(subParent.pomPath, "pom") orElse
+ checkPackaging(pomPath, "pom")
+ }
+ def checkPackaging(pom: Path, expected: String) =
+ {
+ val packaging = (readPom(pom) \\ "packaging").text
+ if(packaging == expected) None else Some("Incorrect packaging for '" + pom + "'. Expected '" + expected + "', but got '" + packaging + "'")
+ }
+}
\ No newline at end of file
diff --git a/sbt/src/sbt-test/dependency-management/pom-packaging/test b/sbt/src/sbt-test/dependency-management/pom-packaging/test
new file mode 100644
index 000000000..11e80e7a3
--- /dev/null
+++ b/sbt/src/sbt-test/dependency-management/pom-packaging/test
@@ -0,0 +1,4 @@
+-> check-pom
+> package
+> make-pom
+> check-pom
\ No newline at end of file