From d3246e591526b8e264729287b9bfea08fccd3047 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Tue, 31 Mar 2015 10:59:41 -0400 Subject: [PATCH 1/3] Add retrieveManagedSync --- ivy/src/main/scala/sbt/IvyActions.scala | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/ivy/src/main/scala/sbt/IvyActions.scala b/ivy/src/main/scala/sbt/IvyActions.scala index bc4bd61fd..bd2647c4d 100644 --- a/ivy/src/main/scala/sbt/IvyActions.scala +++ b/ivy/src/main/scala/sbt/IvyActions.scala @@ -31,7 +31,7 @@ final class UpdateConfiguration(val retrieve: Option[RetrieveConfiguration], val logging: UpdateLogging.Value = this.logging): UpdateConfiguration = new UpdateConfiguration(retrieve, missingOk, logging) } -final class RetrieveConfiguration(val retrieveDirectory: File, val outputPattern: String) +final class RetrieveConfiguration(val retrieveDirectory: File, val outputPattern: String, val sync: 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, Artifact.PomType)) // exclude is a map on a restricted ModuleID final case class GetClassifiersConfiguration(module: GetClassifiersModule, exclude: Map[ModuleID, Set[String]], configuration: UpdateConfiguration, ivyScala: Option[IvyScala]) @@ -177,7 +177,7 @@ object IvyActions { Left(UnresolvedWarning(x, uwconfig)) case Right(uReport) => configuration.retrieve match { - case Some(rConf) => Right(retrieve(ivy, uReport, rConf)) + case Some(rConf) => Right(retrieve(log, ivy, uReport, rConf)) case None => Right(uReport) } } @@ -193,7 +193,7 @@ object IvyActions { val cachedDescriptor = ivy.getSettings.getResolutionCacheManager.getResolvedIvyFileInCache(md.getModuleRevisionId) val uReport = IvyRetrieve.updateReport(report, cachedDescriptor) configuration.retrieve match { - case Some(rConf) => Right(retrieve(ivy, uReport, rConf)) + case Some(rConf) => Right(retrieve(log, ivy, uReport, rConf)) case None => Right(uReport) } } @@ -292,11 +292,12 @@ object IvyActions { } else None (resolveReport, err) } - private def retrieve(ivy: Ivy, report: UpdateReport, config: RetrieveConfiguration): UpdateReport = - retrieve(ivy, report, config.retrieveDirectory, config.outputPattern) + private def retrieve(log: Logger, ivy: Ivy, report: UpdateReport, config: RetrieveConfiguration): UpdateReport = + retrieve(log, ivy, report, config.retrieveDirectory, config.outputPattern, config.sync) - private def retrieve(ivy: Ivy, report: UpdateReport, base: File, pattern: String): UpdateReport = + private def retrieve(log: Logger, ivy: Ivy, report: UpdateReport, base: File, pattern: String, sync: Boolean): UpdateReport = { + val existingFiles = PathFinder(base).***.get filterNot { _.isDirectory } val toCopy = new collection.mutable.HashSet[(File, File)] val retReport = report retrieve { (conf, mid, art, cached) => val to = retrieveTarget(conf, mid, art, base, pattern) @@ -304,6 +305,15 @@ object IvyActions { to } IO.copy(toCopy) + val resolvedFiles = toCopy.map(_._2) + if (sync) { + val filesToDelete = existingFiles.filterNot(resolvedFiles.contains) + filesToDelete foreach { f => + log.info(s"Deleting old dependency: ${f.getAbsolutePath}") + f.delete() + } + } + retReport } private def retrieveTarget(conf: String, mid: ModuleID, art: Artifact, base: File, pattern: String): File = From 31d71c72e281bef948cff613de329e804cdf85f7 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Tue, 31 Mar 2015 13:03:49 -0400 Subject: [PATCH 2/3] Fix compilation error in BaseIvySpecification --- ivy/src/test/scala/BaseIvySpecification.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ivy/src/test/scala/BaseIvySpecification.scala b/ivy/src/test/scala/BaseIvySpecification.scala index 1be01ab25..00cbfc013 100644 --- a/ivy/src/test/scala/BaseIvySpecification.scala +++ b/ivy/src/test/scala/BaseIvySpecification.scala @@ -54,7 +54,7 @@ trait BaseIvySpecification extends Specification { def ivyUpdateEither(module: IvySbt#Module): Either[UnresolvedWarning, UpdateReport] = { // IO.delete(currentTarget) - val retrieveConfig = new RetrieveConfiguration(currentManaged, Resolver.defaultRetrievePattern) + val retrieveConfig = new RetrieveConfiguration(currentManaged, Resolver.defaultRetrievePattern, false) val config = new UpdateConfiguration(Some(retrieveConfig), false, UpdateLogging.Full) IvyActions.updateEither(module, config, UnresolvedWarningConfiguration(), LogicalClock.unknown, Some(currentDependency), log) } From 983d07bd86097a867fbc38676cbaf0c7b10a6d7d Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 3 Apr 2015 11:33:12 -0400 Subject: [PATCH 3/3] Add constructor with default sync value --- ivy/src/main/scala/sbt/IvyActions.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ivy/src/main/scala/sbt/IvyActions.scala b/ivy/src/main/scala/sbt/IvyActions.scala index bd2647c4d..3fa3c5476 100644 --- a/ivy/src/main/scala/sbt/IvyActions.scala +++ b/ivy/src/main/scala/sbt/IvyActions.scala @@ -31,7 +31,9 @@ final class UpdateConfiguration(val retrieve: Option[RetrieveConfiguration], val logging: UpdateLogging.Value = this.logging): UpdateConfiguration = new UpdateConfiguration(retrieve, missingOk, logging) } -final class RetrieveConfiguration(val retrieveDirectory: File, val outputPattern: String, val sync: Boolean) +final class RetrieveConfiguration(val retrieveDirectory: File, val outputPattern: String, val sync: Boolean) { + def this(retrieveDirectory: File, outputPattern: String) = this(retrieveDirectory, outputPattern, false) +} 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, Artifact.PomType)) // exclude is a map on a restricted ModuleID final case class GetClassifiersConfiguration(module: GetClassifiersModule, exclude: Map[ModuleID, Set[String]], configuration: UpdateConfiguration, ivyScala: Option[IvyScala])