From 72e395cfbda716c526d36a237813843ff69f6a73 Mon Sep 17 00:00:00 2001 From: Binh Nguyen Date: Fri, 25 Jun 2021 13:24:28 +0700 Subject: [PATCH 1/2] add ability to filter modules from lock file This is necessary for multi module projects where the internal modules version keeps changing --- .../purpledragon/sbt/lock/DependencyLockPlugin.scala | 12 +++++++++--- .../purpledragon/sbt/lock/DependencyUtils.scala | 12 ++++++++---- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/main/scala/software/purpledragon/sbt/lock/DependencyLockPlugin.scala b/src/main/scala/software/purpledragon/sbt/lock/DependencyLockPlugin.scala index d69546a..0e09d7b 100644 --- a/src/main/scala/software/purpledragon/sbt/lock/DependencyLockPlugin.scala +++ b/src/main/scala/software/purpledragon/sbt/lock/DependencyLockPlugin.scala @@ -19,6 +19,7 @@ package software.purpledragon.sbt.lock import sbt.Keys._ import sbt._ import sbt.internal.util.ManagedLogger +import sbt.librarymanagement.{DependencyFilter, ModuleFilter} import software.purpledragon.sbt.lock.DependencyLockUpdateMode._ import software.purpledragon.sbt.lock.model.{DependencyLockFile, LockFileMatches} import software.purpledragon.sbt.lock.util.MessageUtil @@ -30,6 +31,7 @@ object DependencyLockPlugin extends AutoPlugin { val dependencyLockFile = settingKey[File]("lockfile to generate") val dependencyLockWrite = taskKey[File]("write dependencies to lockfile") val dependencyLockRead = taskKey[Option[DependencyLockFile]]("read dependencies from lockfile") + val dependencyLockExclusion = settingKey[ModuleFilter]("lockfile module exclusion filter") val dependencyLockCheck = taskKey[Unit]("check if dependency lock is up to date") @@ -46,11 +48,13 @@ object DependencyLockPlugin extends AutoPlugin { override def projectSettings: Seq[Def.Setting[_]] = Seq( dependencyLockFile := baseDirectory.value / "build.sbt.lock", dependencyLockAutoCheck := DependencyLockUpdateMode.WarnOnError, + dependencyLockExclusion := DependencyFilter.fnToModuleFilter(_ => false), dependencyLockWrite := { val dest = dependencyLockFile.value val updateReport = update.value + val exclusionFilter = dependencyLockExclusion.value - val lockFile = DependencyUtils.resolve(updateReport, thisProject.value.configurations.map(_.toConfigRef)) + val lockFile = DependencyUtils.resolve(updateReport, exclusionFilter, thisProject.value.configurations.map(_.toConfigRef)) DependencyLockIO.writeLockFile(lockFile, dest) dest }, @@ -62,9 +66,10 @@ object DependencyLockPlugin extends AutoPlugin { dependencyLockCheck := { val logger: ManagedLogger = streams.value.log val updateReport: UpdateReport = update.value + val exclusionFilter = dependencyLockExclusion.value val currentFile = dependencyLockRead.value.getOrElse(sys.error(MessageUtil.formatMessage("lock.status.missing"))) - val updatedFile = DependencyUtils.resolve(updateReport, thisProject.value.configurations.map(_.toConfigRef)) + val updatedFile = DependencyUtils.resolve(updateReport, exclusionFilter, thisProject.value.configurations.map(_.toConfigRef)) val changes = currentFile.findChanges(updatedFile) @@ -82,13 +87,14 @@ object DependencyLockPlugin extends AutoPlugin { // check to see if the current command/task is one of our internal ones val skipCheck = state.value.currentCommand.map(_.commandLine).exists(PluginTasks.contains) val checkMode = dependencyLockAutoCheck.value + val exclusionFilter = dependencyLockExclusion.value if (checkMode != DependencyLockUpdateMode.CheckDisabled && !skipCheck) { logger.debug("Automatically checking lockfile") dependencyLockRead.value match { case Some(currentFile) => - val updatedFile = DependencyUtils.resolve(report, thisProject.value.configurations.map(_.toConfigRef)) + val updatedFile = DependencyUtils.resolve(report, exclusionFilter, thisProject.value.configurations.map(_.toConfigRef)) val changes = currentFile.findChanges(updatedFile) diff --git a/src/main/scala/software/purpledragon/sbt/lock/DependencyUtils.scala b/src/main/scala/software/purpledragon/sbt/lock/DependencyUtils.scala index 00ae5f2..3e264d3 100644 --- a/src/main/scala/software/purpledragon/sbt/lock/DependencyUtils.scala +++ b/src/main/scala/software/purpledragon/sbt/lock/DependencyUtils.scala @@ -17,14 +17,14 @@ package software.purpledragon.sbt.lock import java.time.Instant - import sbt._ +import sbt.librarymanagement.ModuleFilter import software.purpledragon.sbt.lock.model.{DependencyLockFile, DependencyRef, ResolvedArtifact, ResolvedDependency} -import scala.collection.{immutable, mutable, SortedSet} +import scala.collection.{SortedSet, immutable, mutable} object DependencyUtils { - def resolve(updateReport: UpdateReport, configs: Seq[ConfigRef]): DependencyLockFile = { + def resolve(updateReport: UpdateReport, exclusion: ModuleFilter, configs: Seq[ConfigRef]): DependencyLockFile = { val configurations: immutable.Seq[ConfigurationReport] = updateReport.configurations.filter(config => configs.contains(config.configuration)) @@ -34,7 +34,11 @@ object DependencyUtils { configurations.foldLeft(Map.empty[DependencyRef, ResolvedDependency]) { (acc, conf) => val configName = conf.configuration.name - conf.modules.foldLeft(acc) { (acc2, module) => + val filteredModules = conf.modules.filterNot { moduleReport => + exclusion(moduleReport.module) + } + + filteredModules.foldLeft(acc) { (acc2, module) => resolveModuleForConfig(acc2, configName, module, checksumCache) } } From 848958997083049985954ccde0fcae77b50ce8d4 Mon Sep 17 00:00:00 2001 From: Binh Nguyen Date: Fri, 25 Jun 2021 15:41:58 +0700 Subject: [PATCH 2/2] move settings to global scope to allow projects an easier way to overwrite their values --- .../purpledragon/sbt/lock/DependencyLockPlugin.scala | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/scala/software/purpledragon/sbt/lock/DependencyLockPlugin.scala b/src/main/scala/software/purpledragon/sbt/lock/DependencyLockPlugin.scala index 0e09d7b..6d0372a 100644 --- a/src/main/scala/software/purpledragon/sbt/lock/DependencyLockPlugin.scala +++ b/src/main/scala/software/purpledragon/sbt/lock/DependencyLockPlugin.scala @@ -47,8 +47,6 @@ object DependencyLockPlugin extends AutoPlugin { override def projectSettings: Seq[Def.Setting[_]] = Seq( dependencyLockFile := baseDirectory.value / "build.sbt.lock", - dependencyLockAutoCheck := DependencyLockUpdateMode.WarnOnError, - dependencyLockExclusion := DependencyFilter.fnToModuleFilter(_ => false), dependencyLockWrite := { val dest = dependencyLockFile.value val updateReport = update.value @@ -122,4 +120,9 @@ object DependencyLockPlugin extends AutoPlugin { } }.value ) + + override def globalSettings: Seq[Def.Setting[_]] = Seq( + dependencyLockAutoCheck := DependencyLockUpdateMode.WarnOnError, + dependencyLockExclusion := DependencyFilter.fnToModuleFilter(_ => false) + ) }