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