From 63857ddd16ff5129a4580a1e84a0ea14dbf390c8 Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Sun, 12 Jun 2011 21:32:51 -0400 Subject: [PATCH] add pomAllRepositories option to include module configuration resolvers in pom. closes #39 --- ivy/IvyActions.scala | 6 +++--- ivy/MakePom.scala | 13 +++++++------ main/Defaults.scala | 13 +++++++------ main/Keys.scala | 1 + 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/ivy/IvyActions.scala b/ivy/IvyActions.scala index a53179575..5149fb3cf 100644 --- a/ivy/IvyActions.scala +++ b/ivy/IvyActions.scala @@ -26,7 +26,7 @@ final class PublishConfiguration(val ivyFile: Option[File], val resolverName: St final class UpdateConfiguration(val retrieve: Option[RetrieveConfiguration], val missingOk: Boolean, val logging: UpdateLogging.Value) final class RetrieveConfiguration(val retrieveDirectory: File, val outputPattern: String) -final case class MakePomConfiguration(file: File, configurations: Option[Iterable[Configuration]] = None, extra: NodeSeq = NodeSeq.Empty, process: XNode => XNode = n => n, filterRepositories: MavenRepository => Boolean = _ => true) +final case class MakePomConfiguration(file: File, configurations: Option[Iterable[Configuration]] = None, extra: NodeSeq = NodeSeq.Empty, process: XNode => XNode = n => n, filterRepositories: MavenRepository => Boolean = _ => true, allRepositories: Boolean) /** Configures logging during an 'update'. `level` determines the amount of other information logged. * `Full` is the default and logs the most. @@ -63,9 +63,9 @@ object IvyActions /** Creates a Maven pom from the given Ivy configuration*/ def makePom(module: IvySbt#Module, configuration: MakePomConfiguration, log: Logger) { - import configuration.{configurations, extra, file, filterRepositories, process} + import configuration.{allRepositories, configurations, extra, file, filterRepositories, process} module.withModule(log) { (ivy, md, default) => - (new MakePom).write(ivy, md, configurations, extra, process, filterRepositories, file) + (new MakePom).write(ivy, md, configurations, extra, process, filterRepositories, allRepositories, file) log.info("Wrote " + file.getAbsolutePath) } } diff --git a/ivy/MakePom.scala b/ivy/MakePom.scala index 7fbc42056..9a20e11e5 100644 --- a/ivy/MakePom.scala +++ b/ivy/MakePom.scala @@ -20,8 +20,8 @@ import plugins.resolver.{ChainResolver, DependencyResolver, IBiblioResolver} class MakePom { def encoding = "UTF-8" - def write(ivy: Ivy, module: ModuleDescriptor, configurations: Option[Iterable[Configuration]], extra: NodeSeq, process: XNode => XNode, filterRepositories: MavenRepository => Boolean, output: File): Unit = - write(process(toPom(ivy, module, configurations, extra, filterRepositories)), output) + def write(ivy: Ivy, module: ModuleDescriptor, configurations: Option[Iterable[Configuration]], extra: NodeSeq, process: XNode => XNode, filterRepositories: MavenRepository => Boolean, allRepositories: Boolean, output: File): Unit = + write(process(toPom(ivy, module, configurations, extra, filterRepositories, allRepositories)), output) def write(node: XNode, output: File): Unit = write(toString(node), output) def write(xmlString: String, output: File) { @@ -37,13 +37,13 @@ class MakePom } def toString(node: XNode): String = new PrettyPrinter(1000, 4).format(node) - def toPom(ivy: Ivy, module: ModuleDescriptor, configurations: Option[Iterable[Configuration]], extra: NodeSeq, filterRepositories: MavenRepository => Boolean): XNode = + def toPom(ivy: Ivy, module: ModuleDescriptor, configurations: Option[Iterable[Configuration]], extra: NodeSeq, filterRepositories: MavenRepository => Boolean, allRepositories: Boolean): XNode = ( 4.0.0 { makeModuleID(module) } { extra } { makeDependencies(module, configurations) } - { makeRepositories(ivy.getSettings, filterRepositories) } + { makeRepositories(ivy.getSettings, allRepositories, filterRepositories) } ) def makeModuleID(module: ModuleDescriptor): NodeSeq = @@ -126,10 +126,10 @@ class MakePom def isOptional(confs: Array[String]) = confs.isEmpty || (confs.length == 1 && confs(0) == Configurations.Optional.name) - def makeRepositories(settings: IvySettings, filterRepositories: MavenRepository => Boolean) = + def makeRepositories(settings: IvySettings, includeAll: Boolean, filterRepositories: MavenRepository => Boolean) = { class MavenRepo(name: String, snapshots: Boolean, releases: Boolean) - val repositories = resolvers(settings.getDefaultResolver) + val repositories = if(includeAll) allResolvers(settings) else resolvers(settings.getDefaultResolver) val mavenRepositories = repositories.flatMap { case m: IBiblioResolver if m.isM2compatible && m.getRoot != IBiblioResolver.DEFAULT_M2_ROOT => @@ -139,6 +139,7 @@ class MakePom val repositoryElements = mavenRepositories.filter(filterRepositories).map(mavenRepository) if(repositoryElements.isEmpty) repositoryElements else {repositoryElements} } + def allResolvers(settings: IvySettings): Seq[DependencyResolver] = flatten(castResolvers(settings.getResolvers)).distinct 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 } diff --git a/main/Defaults.scala b/main/Defaults.scala index c3b870589..691281535 100644 --- a/main/Defaults.scala +++ b/main/Defaults.scala @@ -62,7 +62,7 @@ object Defaults extends BuildCommon javaHome :== None, version :== "0.1", outputStrategy :== None, - exportJars := false, + exportJars :== false, fork :== false, javaOptions :== Nil, sbtPlugin :== false, @@ -81,9 +81,10 @@ object Defaults extends BuildCommon artifactClassifier in packageSrc :== Some(SourceClassifier), artifactClassifier in packageDoc :== Some(DocClassifier), checksums :== IvySbt.DefaultChecksums, - pomExtra := NodeSeq.Empty, - pomPostProcess := idFun, - pomIncludeRepository := Classpaths.defaultRepositoryFilter + pomExtra :== NodeSeq.Empty, + pomPostProcess :== idFun, + pomAllRepositories :== false, + pomIncludeRepository :== Classpaths.defaultRepositoryFilter )) def projectCore: Seq[Setting[_]] = Seq( name <<= thisProject(_.id), @@ -608,8 +609,8 @@ object Classpaths (project.configurations ++ project.configurations.map(internalMap) ++ (if(auto) CompilerPlugin :: Nil else Nil)).distinct }, moduleSettings <<= moduleSettings0, - makePomConfiguration <<= (artifactPath in makePom, pomExtra, pomPostProcess, pomIncludeRepository) { - (file, extra, process, include) => new MakePomConfiguration(file, None, extra, process, include) + makePomConfiguration <<= (artifactPath in makePom, pomExtra, pomPostProcess, pomIncludeRepository, pomAllRepositories) { + (file, extra, process, include, all) => new MakePomConfiguration(file, None, extra, process, include, all) }, deliverLocalConfiguration <<= (crossTarget, ivyLoggingLevel) map { (outDir, level) => deliverConfig( outDir, logging = level ) }, deliverConfiguration <<= deliverLocalConfiguration.identity, diff --git a/main/Keys.scala b/main/Keys.scala index 1efc528e8..be0ed37aa 100644 --- a/main/Keys.scala +++ b/main/Keys.scala @@ -216,6 +216,7 @@ object Keys val pomExtra = SettingKey[NodeSeq]("pom-extra", "Extra XML to insert into the generated POM.") val pomPostProcess = SettingKey[XNode => XNode]("pom-post-process", "Transforms the generated POM.") val pomIncludeRepository = SettingKey[MavenRepository => Boolean]("pom-include-repository", "Selects repositories to include in the generated POM.") + val pomAllRepositories = SettingKey[Boolean]("pom-all-repositories", "If true, includes repositories used in module configurations in the pom repositories section. If false, only the common repositories are included.") val moduleName = SettingKey[String]("module-name", "The name of the current module, used for dependency management.") val version = SettingKey[String]("version", "The version/revision of the current module.")