diff --git a/ivy/IvyActions.scala b/ivy/IvyActions.scala index 58a6571c8..88bd731cf 100644 --- a/ivy/IvyActions.scala +++ b/ivy/IvyActions.scala @@ -47,7 +47,7 @@ object IvyActions module.withModule { (ivy, md, default) => addLateDependencies(ivy, md, default, extraDependencies) val pomModule = keepConfigurations(md, configurations) - (new PomWriter).write(pomModule, extra, output) + (new MakePom).write(ivy, pomModule, extra, output) module.logger.info("Wrote " + output.getAbsolutePath) } } diff --git a/ivy/MakePom.scala b/ivy/MakePom.scala index 06a515672..f2089a254 100644 --- a/ivy/MakePom.scala +++ b/ivy/MakePom.scala @@ -4,32 +4,41 @@ package sbt; import java.io.{BufferedWriter, File, OutputStreamWriter, FileOutputStream} -import scala.xml.{Node, NodeSeq, XML} +import scala.xml.{Node, NodeSeq, PrettyPrinter, XML} -import org.apache.ivy.{core, Ivy} +import org.apache.ivy.{core, plugins, Ivy} +import core.settings.IvySettings import core.module.{descriptor, id} import descriptor.{DependencyDescriptor, License, ModuleDescriptor} import id.ModuleRevisionId +import plugins.resolver.{ChainResolver, DependencyResolver, IBiblioResolver} -class PomWriter +class MakePom { def encoding = "UTF-8" - def write(module: ModuleDescriptor, extra: NodeSeq, output: File): Unit = write(toPom(module, extra), output) - def write(node: Node, output: File) + def write(ivy: Ivy, module: ModuleDescriptor, extra: NodeSeq, output: File): Unit = write(toPom(ivy, module, extra), output) + def write(node: Node, output: File): Unit = write(toString(node), output) + def write(xmlString: String, output: File) { output.getParentFile.mkdirs() val out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(output), encoding)) - try { XML.write(out, node, encoding, true, null) } + try + { + out.write("") + out.newLine() + out.write(xmlString) + } finally { out.close() } } - def toPom(module: ModuleDescriptor, extra: NodeSeq): Node = + def toString(node: Node): String = new PrettyPrinter(1000, 4).format(node) + def toPom(ivy: Ivy, module: ModuleDescriptor, extra: NodeSeq): Node = ( 4.0.0 { makeModuleID(module) } { extra } { makeDependencies(module) } - + { makeRepositories(ivy.getSettings) } ) def makeModuleID(module: ModuleDescriptor): NodeSeq = @@ -101,4 +110,36 @@ class PomWriter } } def isOptional(confs: Array[String]) = confs.isEmpty || (confs.length == 1 && confs(0) == Configurations.Optional.name) + + + def makeRepositories(settings: IvySettings) = + { + class MavenRepo(name: String, snapshots: Boolean, releases: Boolean) + val repositories = resolvers(settings.getDefaultResolver) + val mavenRepositories = + repositories.flatMap { + case m: IBiblioResolver if m.isM2compatible && m.getRoot != IBiblioResolver.DEFAULT_M2_ROOT => m :: Nil + case _ => Nil + } + mavenRepositories.map { repo => mavenRepository(repo.getName, repo.getRoot) } + } + def flatten(rs: Seq[DependencyResolver]): Seq[DependencyResolver] = if(rs eq null) Nil else rs.flatMap(resolvers) + def resolvers(r: DependencyResolver): Seq[DependencyResolver] = + r match { case c: ChainResolver => flatten(castResolvers(c.getResolvers)); case _ => r :: Nil } + + // cast the contents of a pre-generics collection + private def castResolvers(s: java.util.Collection[_]): Seq[DependencyResolver] = + s.toArray.map(_.asInstanceOf[DependencyResolver]) + + def toID(name: String) = checkID(name.filter(isValidIDCharacter).mkString, name) + def isValidIDCharacter(c: Char) = c.isLetterOrDigit + private def checkID(id: String, name: String) = if(id.isEmpty) error("Could not convert '" + name + "' to an ID") else id + def mavenRepository(name: String, root: String): Node = + mavenRepository(toID(name), name, root) + def mavenRepository(id: String, name: String, root: String): Node = + + {id} + {name} + {root} + }