From 6acbbb05a366a34a1c25990b5bd83098aa2a3666 Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Thu, 21 Jul 2011 22:03:56 -0400 Subject: [PATCH] support configuring checksums differently for publish, publish-local, update, and update-sbt-classifiers. fixes #115 --- ivy/IvyActions.scala | 15 ++++++++++++--- main/Defaults.scala | 14 +++++++------- main/Keys.scala | 4 ++-- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/ivy/IvyActions.scala b/ivy/IvyActions.scala index ad0f4cdca..0d62ea547 100644 --- a/ivy/IvyActions.scala +++ b/ivy/IvyActions.scala @@ -19,10 +19,10 @@ import core.report.{ArtifactDownloadReport,ResolveReport} import core.resolve.ResolveOptions import core.retrieve.RetrieveOptions import plugins.parser.m2.{PomModuleDescriptorParser,PomModuleDescriptorWriter} -import plugins.resolver.DependencyResolver +import plugins.resolver.{BasicResolver, DependencyResolver} final class DeliverConfiguration(val deliverIvyPattern: String, val status: String, val configurations: Option[Seq[Configuration]], val logging: UpdateLogging.Value) -final class PublishConfiguration(val ivyFile: Option[File], val resolverName: String, val artifacts: Map[Artifact, File], val logging: UpdateLogging.Value) +final class PublishConfiguration(val ivyFile: Option[File], val resolverName: String, val artifacts: Map[Artifact, File], val checksums: Seq[String], val logging: UpdateLogging.Value) final class UpdateConfiguration(val retrieve: Option[RetrieveConfiguration], val missingOk: Boolean, val logging: UpdateLogging.Value) final class RetrieveConfiguration(val retrieveDirectory: File, val outputPattern: String) @@ -94,9 +94,18 @@ object IvyActions val ivyArtifact = ivyFile map { file => (MDArtifact.newIvyArtifact(md), file) } val is = crossIvyScala(module.moduleSettings) val as = mapArtifacts(md, is, artifacts) ++ ivyArtifact.toList - publish(md, as, resolver, overwrite = true) + withChecksums(resolver, checksums) { publish(md, as, resolver, overwrite = true) } } } + private[this] def withChecksums[T](resolver: DependencyResolver, checksums: Seq[String])(act: => T): T = + resolver match { case br: BasicResolver => withChecksums(br, checksums)(act); case _ => act } + private[this] def withChecksums[T](resolver: BasicResolver, checksums: Seq[String])(act: => T): T = + { + val previous = resolver.getChecksumAlgorithms + resolver.setChecksums(checksums mkString ",") + try { act } + finally { resolver.setChecksums(previous mkString ",") } + } private def crossIvyScala(moduleSettings: ModuleSettings): Option[IvyScala] = moduleSettings match { case i: InlineConfiguration if i.module.crossVersion => i.ivyScala diff --git a/main/Defaults.scala b/main/Defaults.scala index 3cf33547c..ad8da87be 100644 --- a/main/Defaults.scala +++ b/main/Defaults.scala @@ -638,11 +638,11 @@ object Classpaths }, deliverLocalConfiguration <<= (crossTarget, ivyLoggingLevel) map { (outDir, level) => deliverConfig( outDir, logging = level ) }, deliverConfiguration <<= deliverLocalConfiguration.identity, - publishConfiguration <<= (packagedArtifacts, publishTo, publishMavenStyle, deliver, ivyLoggingLevel) map { (arts, publishTo, mavenStyle, ivyFile, level) => - publishConfig(arts, if(mavenStyle) None else Some(ivyFile), resolverName = getPublishTo(publishTo).name, logging = level) + publishConfiguration <<= (packagedArtifacts, publishTo, publishMavenStyle, deliver, checksums in publish, ivyLoggingLevel) map { (arts, publishTo, mavenStyle, ivyFile, checks, level) => + publishConfig(arts, if(mavenStyle) None else Some(ivyFile), resolverName = getPublishTo(publishTo).name, checksums = checks, logging = level) }, - publishLocalConfiguration <<= (packagedArtifacts, deliverLocal, ivyLoggingLevel) map { - (arts, ivyFile, level) => publishConfig(arts, Some(ivyFile), logging = level ) + publishLocalConfiguration <<= (packagedArtifacts, deliverLocal, checksums in publishLocal, ivyLoggingLevel) map { + (arts, ivyFile, checks, level) => publishConfig(arts, Some(ivyFile), checks, logging = level ) }, ivySbt <<= ivySbt0, ivyModule <<= (ivySbt, moduleSettings) map { (ivySbt, settings) => new ivySbt.Module(settings) }, @@ -751,8 +751,8 @@ object Classpaths def deliverConfig(outputDirectory: File, status: String = "release", logging: UpdateLogging.Value = UpdateLogging.DownloadOnly) = new DeliverConfiguration(deliverPattern(outputDirectory), status, None, logging) - def publishConfig(artifacts: Map[Artifact, File], ivyFile: Option[File], resolverName: String = "local", logging: UpdateLogging.Value = UpdateLogging.DownloadOnly) = - new PublishConfiguration(ivyFile, resolverName, artifacts, logging) + def publishConfig(artifacts: Map[Artifact, File], ivyFile: Option[File], checksums: Seq[String], resolverName: String = "local", logging: UpdateLogging.Value = UpdateLogging.DownloadOnly) = + new PublishConfiguration(ivyFile, resolverName, artifacts, checksums, logging) def deliverPattern(outputPath: File): String = (outputPath / "[artifact]-[revision](-[classifier]).[ext]").absolutePath @@ -790,7 +790,7 @@ object Classpaths def unmanagedDependencies: Initialize[Task[Classpath]] = (thisProjectRef, thisProject, configuration, settings) flatMap unmanagedDependencies0 def mkIvyConfiguration: Initialize[Task[IvyConfiguration]] = - (fullResolvers, ivyPaths, otherResolvers, moduleConfigurations, offline, checksums, appConfiguration, streams) map { (rs, paths, other, moduleConfs, off, check, app, s) => + (fullResolvers, ivyPaths, otherResolvers, moduleConfigurations, offline, checksums in update, appConfiguration, streams) map { (rs, paths, other, moduleConfs, off, check, app, s) => new InlineIvyConfiguration(paths, rs, other, moduleConfs, off, Some(lock(app)), check, s.log) } diff --git a/main/Keys.scala b/main/Keys.scala index 9d8386e9b..0071ee8e3 100644 --- a/main/Keys.scala +++ b/main/Keys.scala @@ -200,9 +200,9 @@ object Keys val ivyModule = TaskKey[IvySbt#Module]("ivy-module", "Provides the sbt interface to a configured Ivy module.") val classpathFilter = SettingKey[FileFilter]("classpath-filter", "Filter for selecting unmanaged dependencies.") val update = TaskKey[UpdateReport]("update", "Resolves and optionally retrieves dependencies, producing a report.") - val updateClassifiers = TaskKey[UpdateReport]("update-classifiers", "Resolves and optionally retrieves classified artifacts, such as javadocs and sources, for dependency definitions, transitively.") + val updateClassifiers = TaskKey[UpdateReport]("update-classifiers", "Resolves and optionally retrieves classified artifacts, such as javadocs and sources, for dependency definitions, transitively.", update) val transitiveClassifiers = SettingKey[Seq[String]]("transitive-classifiers", "List of classifiers used for transitively obtaining extra artifacts for sbt or declared dependencies.") - val updateSbtClassifiers = TaskKey[UpdateReport]("update-sbt-classifiers", "Resolves and optionally retrieves classifiers, such as javadocs and sources, for sbt, transitively.") + val updateSbtClassifiers = TaskKey[UpdateReport]("update-sbt-classifiers", "Resolves and optionally retrieves classifiers, such as javadocs and sources, for sbt, transitively.", updateClassifiers) val publishConfiguration = TaskKey[PublishConfiguration]("publish-configuration", "Configuration for publishing to a repository.") val publishLocalConfiguration = TaskKey[PublishConfiguration]("publish-local-configuration", "Configuration for publishing to the local repository.")