detect packaging for make-pom

This commit is contained in:
Mark Harrah 2010-03-30 09:19:36 -04:00
parent 5909728299
commit 9720566f84
7 changed files with 72 additions and 39 deletions

View File

@ -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
}
}

View File

@ -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)
}
}

View File

@ -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 =
(<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
{ makeModuleID(module) }
{ extra }
{ makeDependencies(module) }
{ makeDependencies(module, configurations) }
{ makeRepositories(ivy.getSettings) }
</project>)
@ -51,7 +52,7 @@ class MakePom
val a: NodeSeq =
(<groupId>{ mrid.getOrganisation }</groupId>
<artifactId>{ mrid.getName }</artifactId>
<packaging>{ packaging(mrid) }</packaging>)
<packaging>{ packaging(module) }</packaging>)
val b: NodeSeq =
( (description(module.getDescription) ++
homePage(module.getHomePage) ++
@ -70,11 +71,19 @@ class MakePom
</license>
def homePage(homePage: String) = if(homePage eq null) NodeSeq.Empty else <url>{homePage}</url>
def revision(version: String) = if(version ne null) <version>{version}</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
<dependencies>
@ -147,4 +156,21 @@ class MakePom
<name>{name}</name>
<url>{root}</url>
</repository>
}
/** 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
}
}

View File

@ -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. */

View File

@ -0,0 +1,2 @@
project.name=Pom Test
project.version=1.0

View File

@ -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 + "'")
}
}

View File

@ -0,0 +1,4 @@
-> check-pom
> package
> make-pom
> check-pom