From 31f5133ff634164bbe480c3a3ddcc8f6291ca68d Mon Sep 17 00:00:00 2001 From: Indrajit Raychaudhuri Date: Tue, 22 Nov 2011 02:08:16 +0530 Subject: [PATCH] Miscellaneous updates - honor includeTypes to filter dependency artifact candidates for classifier setting - prefer the more stable Seq[_] instead of Iterable[_] - import cleanups --- ivy/IvyActions.scala | 32 +++++++++++++------------------- ivy/MakePom.scala | 27 ++++++++++++++++----------- 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/ivy/IvyActions.scala b/ivy/IvyActions.scala index 07b2740d1..1cabd0a31 100644 --- a/ivy/IvyActions.scala +++ b/ivy/IvyActions.scala @@ -4,21 +4,15 @@ package sbt import java.io.File -import scala.xml.{Node => XNode,NodeSeq} +import scala.xml.{Node => XNode, NodeSeq} import org.apache.ivy.{core, plugins, Ivy} -import core.cache.DefaultRepositoryCacheManager -import core.{IvyPatternHelper,LogOptions} +import core.{IvyPatternHelper, LogOptions} import core.deliver.DeliverOptions import core.install.InstallOptions -import core.module.descriptor.{Artifact => IArtifact, DefaultArtifact, DefaultDependencyArtifactDescriptor, MDArtifact} -import core.module.descriptor.{DefaultDependencyDescriptor, DefaultModuleDescriptor, DependencyDescriptor, ModuleDescriptor} -import core.module.id.{ArtifactId,ModuleId, ModuleRevisionId} -import core.publish.PublishOptions -import core.report.{ArtifactDownloadReport,ResolveReport} +import core.module.descriptor.{Artifact => IArtifact, MDArtifact, ModuleDescriptor, DefaultModuleDescriptor} +import core.report.ResolveReport import core.resolve.ResolveOptions -import core.retrieve.RetrieveOptions -import plugins.parser.m2.{PomModuleDescriptorParser,PomModuleDescriptorWriter} import plugins.resolver.{BasicResolver, DependencyResolver} final class DeliverConfiguration(val deliverIvyPattern: String, val status: String, val configurations: Option[Seq[Configuration]], val logging: UpdateLogging.Value) @@ -26,7 +20,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, moduleInfo: ModuleInfo, configurations: Option[Iterable[Configuration]] = None, extra: NodeSeq = NodeSeq.Empty, process: XNode => XNode = n => n, filterRepositories: MavenRepository => Boolean = _ => true, allRepositories: Boolean) +final case class MakePomConfiguration(file: File, moduleInfo: ModuleInfo, configurations: Option[Seq[Configuration]] = None, extra: NodeSeq = NodeSeq.Empty, process: XNode => XNode = n => n, filterRepositories: MavenRepository => Boolean = _ => true, allRepositories: Boolean, includeTypes: Set[String] = Set(Artifact.DefaultType)) // exclude is a map on a restricted ModuleID final case class GetClassifiersConfiguration(module: GetClassifiersModule, exclude: Map[ModuleID, Set[String]], configuration: UpdateConfiguration, ivyScala: Option[IvyScala]) final case class GetClassifiersModule(id: ModuleID, modules: Seq[ModuleID], configurations: Seq[Configuration], classifiers: Seq[String]) @@ -66,9 +60,9 @@ object IvyActions /** Creates a Maven pom from the given Ivy configuration*/ def makePom(module: IvySbt#Module, configuration: MakePomConfiguration, log: Logger) { - import configuration.{allRepositories, moduleInfo, configurations, extra, file, filterRepositories, process} + import configuration.{allRepositories, moduleInfo, configurations, extra, file, filterRepositories, process, includeTypes} module.withModule(log) { (ivy, md, default) => - (new MakePom(log)).write(ivy, md, moduleInfo, configurations, extra, process, filterRepositories, allRepositories, file) + (new MakePom(log)).write(ivy, md, moduleInfo, configurations, includeTypes, extra, process, filterRepositories, allRepositories, file) log.info("Wrote " + file.getAbsolutePath) } } @@ -168,8 +162,8 @@ object IvyActions def transitiveScratch(ivySbt: IvySbt, label: String, config: GetClassifiersConfiguration, log: Logger): UpdateReport = { - import config.{configuration => c, ivyScala, module => mod} - import mod.{configurations => confs, id, modules => deps} + import config.{configuration => c, ivyScala, module => mod} + import mod.{id, modules => deps} val base = restrictedCopy(id, true).copy(name = id.name + "$" + label) val module = new ivySbt.Module(InlineConfiguration(base, ModuleInfo(base.name), deps).copy(ivyScala = ivyScala)) val report = update(module, c, log) @@ -178,8 +172,8 @@ object IvyActions } def updateClassifiers(ivySbt: IvySbt, config: GetClassifiersConfiguration, log: Logger): UpdateReport = { - import config.{configuration => c, module => mod, _} - import mod.{configurations => confs, _} + import config.{configuration => c, module => mod, _} + import mod.{configurations => confs, _} assert(!classifiers.isEmpty, "classifiers cannot be empty") val baseModules = modules map { m => restrictedCopy(m, true) } val deps = baseModules.distinct flatMap classifiedArtifacts(classifiers, exclude) @@ -223,7 +217,7 @@ object IvyActions } private def retrieve(ivy: Ivy, report: UpdateReport, config: RetrieveConfiguration): UpdateReport = retrieve(ivy, report, config.retrieveDirectory, config.outputPattern) - + private def retrieve(ivy: Ivy, report: UpdateReport, base: File, pattern: String): UpdateReport = { val toCopy = new collection.mutable.HashSet[(File,File)] @@ -255,7 +249,7 @@ object IvyActions case Full => LOG_DEFAULT } - def publish(module: ModuleDescriptor, artifacts: Iterable[(IArtifact, File)], resolver: DependencyResolver, overwrite: Boolean): Unit = + def publish(module: ModuleDescriptor, artifacts: Seq[(IArtifact, File)], resolver: DependencyResolver, overwrite: Boolean): Unit = try { resolver.beginPublishTransaction(module.getModuleRevisionId(), overwrite); for( (artifact, file) <- artifacts) if(file.exists) diff --git a/ivy/MakePom.scala b/ivy/MakePom.scala index c2e70e9a4..e2b5f1778 100644 --- a/ivy/MakePom.scala +++ b/ivy/MakePom.scala @@ -5,7 +5,7 @@ // based on Ivy's PomModuleDescriptorWriter, which is Apache Licensed, Version 2.0 // http://www.apache.org/licenses/LICENSE-2.0 -package sbt; +package sbt import java.io.File // Node needs to be renamed to XNode because the task subproject contains a Node type that will shadow @@ -15,15 +15,17 @@ import Configurations.Optional import org.apache.ivy.{core, plugins, Ivy} import core.settings.IvySettings -import core.module.{descriptor, id} +import core.module.descriptor import descriptor.{DependencyDescriptor, License, ModuleDescriptor, ExcludeRule} -import id.ModuleRevisionId import plugins.resolver.{ChainResolver, DependencyResolver, IBiblioResolver} class MakePom(val log: Logger) { + @deprecated("Use `write(Ivy, ModuleDescriptor, ModuleInfo, Option[Iterable[Configuration]], Set[String], NodeSeq, XNode => XNode, MavenRepository => Boolean, Boolean, File)` instead", "0.11.2") def write(ivy: Ivy, module: ModuleDescriptor, moduleInfo: ModuleInfo, configurations: Option[Iterable[Configuration]], extra: NodeSeq, process: XNode => XNode, filterRepositories: MavenRepository => Boolean, allRepositories: Boolean, output: File): Unit = - write(process(toPom(ivy, module, moduleInfo, configurations, extra, filterRepositories, allRepositories)), output) + write(ivy, module, moduleInfo: ModuleInfo, configurations: Option[Iterable[Configuration]], Set(Artifact.DefaultType), extra, process, filterRepositories, allRepositories, output) + def write(ivy: Ivy, module: ModuleDescriptor, moduleInfo: ModuleInfo, configurations: Option[Iterable[Configuration]], includeTypes: Set[String], extra: NodeSeq, process: XNode => XNode, filterRepositories: MavenRepository => Boolean, allRepositories: Boolean, output: File): Unit = + write(process(toPom(ivy, module, moduleInfo, configurations, includeTypes, extra, filterRepositories, allRepositories)), output) // use \n as newline because toString uses PrettyPrinter, which hard codes line endings to be \n def write(node: XNode, output: File): Unit = write(toString(node), output, "\n") def write(xmlString: String, output: File, newline: String) @@ -32,7 +34,10 @@ class MakePom(val log: Logger) } def toString(node: XNode): String = new PrettyPrinter(1000, 4).format(node) + @deprecated("Use `toPom(Ivy, ModuleDescriptor, ModuleInfo, Option[Iterable[Configuration]], Set[String], NodeSeq, MavenRepository => Boolean, Boolean)` instead", "0.11.2") def toPom(ivy: Ivy, module: ModuleDescriptor, moduleInfo: ModuleInfo, configurations: Option[Iterable[Configuration]], extra: NodeSeq, filterRepositories: MavenRepository => Boolean, allRepositories: Boolean): XNode = + toPom(ivy, module, moduleInfo, configurations, Set(Artifact.DefaultType), extra, filterRepositories, allRepositories) + def toPom(ivy: Ivy, module: ModuleDescriptor, moduleInfo: ModuleInfo, configurations: Option[Iterable[Configuration]], includeTypes: Set[String], extra: NodeSeq, filterRepositories: MavenRepository => Boolean, allRepositories: Boolean): XNode = ( 4.0.0 { makeModuleID(module) } @@ -43,7 +48,7 @@ class MakePom(val log: Logger) { val deps = depsInConfs(module, configurations) makeProperties(module, deps) ++ - makeDependencies(deps) + makeDependencies(deps, includeTypes) } { makeRepositories(ivy.getSettings, allRepositories, filterRepositories) } ) @@ -116,15 +121,15 @@ class MakePom(val log: Logger) } val IgnoreTypes: Set[String] = Set(Artifact.SourceType, Artifact.DocType, Artifact.PomType) - def makeDependencies(dependencies: Seq[DependencyDescriptor]): NodeSeq = + def makeDependencies(dependencies: Seq[DependencyDescriptor], includeTypes: Set[String]): NodeSeq = if(dependencies.isEmpty) NodeSeq.Empty else - { dependencies.map(makeDependency) } + { dependencies.map(makeDependency(_, includeTypes)) } - def makeDependency(dependency: DependencyDescriptor): NodeSeq = + def makeDependency(dependency: DependencyDescriptor, includeTypes: Set[String]): NodeSeq = { val mrid = dependency.getDependencyRevisionId @@ -132,14 +137,14 @@ class MakePom(val log: Logger) {mrid.getName} {mrid.getRevision} { scopeAndOptional(dependency) } - { classifier(dependency) } + { classifier(dependency, includeTypes) } { exclusions(dependency) } } - def classifier(dependency: DependencyDescriptor): NodeSeq = + def classifier(dependency: DependencyDescriptor, includeTypes: Set[String]): NodeSeq = { - val jarDep = dependency.getAllDependencyArtifacts.filter(_.getType == Artifact.DefaultType).headOption + val jarDep = dependency.getAllDependencyArtifacts.filter(d => includeTypes(d.getType)).headOption jarDep match { case Some(a) => { val cl = a.getExtraAttribute("classifier")