diff --git a/src/main/scala/software/purpledragon/sbt/lock/DependencyLockPlugin.scala b/src/main/scala/software/purpledragon/sbt/lock/DependencyLockPlugin.scala index d69546a..6d0372a 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") @@ -45,12 +47,12 @@ object DependencyLockPlugin extends AutoPlugin { override def projectSettings: Seq[Def.Setting[_]] = Seq( dependencyLockFile := baseDirectory.value / "build.sbt.lock", - dependencyLockAutoCheck := DependencyLockUpdateMode.WarnOnError, 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 +64,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 +85,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) @@ -116,4 +120,9 @@ object DependencyLockPlugin extends AutoPlugin { } }.value ) + + override def globalSettings: Seq[Def.Setting[_]] = Seq( + dependencyLockAutoCheck := DependencyLockUpdateMode.WarnOnError, + dependencyLockExclusion := DependencyFilter.fnToModuleFilter(_ => false) + ) } 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) } }