Skip to content

Commit fbc0dbd

Browse files
authored
Add ability to filter modules (#32)
* Add ability to filter modules. * Remove build.properties from scripted test.
1 parent 1aa4557 commit fbc0dbd

File tree

13 files changed

+323
-7
lines changed

13 files changed

+323
-7
lines changed

src/main/paradox/settings.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,10 @@ The different levels of checking available are:
2020
* `WarnOnError`: a check will be performed after `update`s, and a warning printed if there are any changes.
2121
* `FailOnError`: a check will be performed after `update`s, and the build will fail if there are any changes.
2222
* `AutoUpdate`: a check will be performed after `update`s, and the lockfile will be automatically updated if there are
23-
any changes.
23+
any changes.
24+
25+
### dependencyLockModuleFilter
26+
27+
* **Description:** Excludes the specified dependencies from the lockfile.
28+
* **Accepts:** `sbt.librarymanagement.ModuleFilter`
29+
* **Default:** `DependencyFilter.fnToModuleFilter(_ => false)` (no exclusions)

src/main/scala/software/purpledragon/sbt/lock/DependencyLockPlugin.scala

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package software.purpledragon.sbt.lock
1919
import sbt._
2020
import sbt.Keys._
2121
import sbt.internal.util.ManagedLogger
22+
import sbt.librarymanagement.{DependencyFilter, ModuleFilter}
2223
import software.purpledragon.sbt.lock.DependencyLockUpdateMode._
2324
import software.purpledragon.sbt.lock.model.{DependencyLockFile, LockFileMatches}
2425
import software.purpledragon.sbt.lock.util.MessageUtil
@@ -30,6 +31,7 @@ object DependencyLockPlugin extends AutoPlugin {
3031
val dependencyLockFile = settingKey[File]("lockfile to generate")
3132
val dependencyLockWrite = taskKey[File]("write dependencies to lockfile")
3233
val dependencyLockRead = taskKey[Option[DependencyLockFile]]("read dependencies from lockfile")
34+
val dependencyLockModuleFilter = settingKey[ModuleFilter]("exclusion filter for dependencies")
3335

3436
val dependencyLockCheck = taskKey[Unit]("check if dependency lock is up to date")
3537

@@ -45,12 +47,12 @@ object DependencyLockPlugin extends AutoPlugin {
4547

4648
override def projectSettings: Seq[Def.Setting[_]] = Seq(
4749
dependencyLockFile := baseDirectory.value / "build.sbt.lock",
48-
dependencyLockAutoCheck := DependencyLockUpdateMode.WarnOnError,
4950
dependencyLockWrite := {
5051
val dest = dependencyLockFile.value
5152
val updateReport = update.value
53+
val exclusionFilter = dependencyLockModuleFilter.value
5254

53-
val lockFile = DependencyUtils.resolve(updateReport, thisProject.value.configurations.map(_.toConfigRef))
55+
val lockFile = DependencyUtils.resolve(updateReport, exclusionFilter, thisProject.value.configurations.map(_.toConfigRef))
5456

5557
val updateStatus = DependencyLockIO
5658
.readLockFile(dest)
@@ -69,9 +71,10 @@ object DependencyLockPlugin extends AutoPlugin {
6971
dependencyLockCheck := {
7072
val logger: ManagedLogger = streams.value.log
7173
val updateReport: UpdateReport = update.value
74+
val exclusionFilter = dependencyLockModuleFilter.value
7275

7376
val currentFile = dependencyLockRead.value.getOrElse(sys.error(MessageUtil.formatMessage("lock.status.missing")))
74-
val updatedFile = DependencyUtils.resolve(updateReport, thisProject.value.configurations.map(_.toConfigRef))
77+
val updatedFile = DependencyUtils.resolve(updateReport, exclusionFilter, thisProject.value.configurations.map(_.toConfigRef))
7578

7679
val changes = currentFile.findChanges(updatedFile)
7780

@@ -89,13 +92,14 @@ object DependencyLockPlugin extends AutoPlugin {
8992
// check to see if the current command/task is one of our internal ones
9093
val skipCheck = state.value.currentCommand.map(_.commandLine).exists(PluginTasks.contains)
9194
val checkMode = dependencyLockAutoCheck.value
95+
val exclusionFilter = dependencyLockModuleFilter.value
9296

9397
if (checkMode != DependencyLockUpdateMode.CheckDisabled && !skipCheck) {
9498
logger.debug("Automatically checking lockfile")
9599

96100
dependencyLockRead.value match {
97101
case Some(currentFile) =>
98-
val updatedFile = DependencyUtils.resolve(report, thisProject.value.configurations.map(_.toConfigRef))
102+
val updatedFile = DependencyUtils.resolve(report, exclusionFilter, thisProject.value.configurations.map(_.toConfigRef))
99103

100104
val changes = currentFile.findChanges(updatedFile)
101105

@@ -129,4 +133,9 @@ object DependencyLockPlugin extends AutoPlugin {
129133
}
130134
}.value
131135
)
136+
137+
override def globalSettings: Seq[Def.Setting[_]] = Seq(
138+
dependencyLockAutoCheck := DependencyLockUpdateMode.WarnOnError,
139+
dependencyLockModuleFilter := DependencyFilter.fnToModuleFilter(_ => false)
140+
)
132141
}

src/main/scala/software/purpledragon/sbt/lock/DependencyUtils.scala

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@ package software.purpledragon.sbt.lock
1919
import java.time.Instant
2020

2121
import sbt._
22+
import sbt.librarymanagement.ModuleFilter
2223
import software.purpledragon.sbt.lock.model.{DependencyLockFile, DependencyRef, ResolvedArtifact, ResolvedDependency}
2324

2425
import scala.collection.{immutable, mutable, SortedSet}
2526

2627
object DependencyUtils {
27-
def resolve(updateReport: UpdateReport, configs: Seq[ConfigRef]): DependencyLockFile = {
28+
def resolve(updateReport: UpdateReport, exclusion: ModuleFilter, configs: Seq[ConfigRef]): DependencyLockFile = {
2829
val configurations: immutable.Seq[ConfigurationReport] =
2930
updateReport.configurations.filter(config => configs.contains(config.configuration))
3031

@@ -34,7 +35,11 @@ object DependencyUtils {
3435
configurations.foldLeft(Map.empty[DependencyRef, ResolvedDependency]) { (acc, conf) =>
3536
val configName = conf.configuration.name
3637

37-
conf.modules.foldLeft(acc) { (acc2, module) =>
38+
val filteredModules = conf.modules.filterNot { moduleReport =>
39+
exclusion(moduleReport.module)
40+
}
41+
42+
filteredModules.foldLeft(acc) { (acc2, module) =>
3843
resolveModuleForConfig(acc2, configName, module, checksumCache)
3944
}
4045
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
scalaVersion := "2.12.10"
2+
3+
libraryDependencies ++= Seq(
4+
"org.apache.commons" % "commons-lang3" % "3.9",
5+
"org.scalatest" %% "scalatest" % "3.0.8" % Test,
6+
)
7+
8+
// One ineffective filter and one for commons-lang3.
9+
dependencyLockModuleFilter := moduleFilter(name = "fake") | moduleFilter(name = "commons-lang3")
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
{
2+
"lockVersion" : 1,
3+
"timestamp" : "2022-08-11T17:47:26.677327Z",
4+
"configurations" : [
5+
"compile",
6+
"optional",
7+
"provided",
8+
"runtime",
9+
"test"
10+
],
11+
"dependencies" : [
12+
{
13+
"org" : "org.scala-lang",
14+
"name" : "scala-library",
15+
"version" : "2.12.10",
16+
"artifacts" : [
17+
{
18+
"name" : "scala-library.jar",
19+
"hash" : "sha1:3509860bc2e5b3da001ed45aca94ffbe5694dbda"
20+
}
21+
],
22+
"configurations" : [
23+
"test",
24+
"compile",
25+
"runtime"
26+
]
27+
},
28+
{
29+
"org" : "org.scala-lang",
30+
"name" : "scala-reflect",
31+
"version" : "2.12.10",
32+
"artifacts" : [
33+
{
34+
"name" : "scala-reflect.jar",
35+
"hash" : "sha1:14cb7beb516cd8e07716133668c427792122c926"
36+
}
37+
],
38+
"configurations" : [
39+
"test"
40+
]
41+
},
42+
{
43+
"org" : "org.scala-lang.modules",
44+
"name" : "scala-xml_2.12",
45+
"version" : "1.2.0",
46+
"artifacts" : [
47+
{
48+
"name" : "scala-xml_2.12.jar",
49+
"hash" : "sha1:5d38ac30beb8420dd395c0af447ba412158965e6"
50+
}
51+
],
52+
"configurations" : [
53+
"test"
54+
]
55+
},
56+
{
57+
"org" : "org.scalactic",
58+
"name" : "scalactic_2.12",
59+
"version" : "3.0.8",
60+
"artifacts" : [
61+
{
62+
"name" : "scalactic_2.12.jar",
63+
"hash" : "sha1:b50559dfc4a691c1089f9c8812e1d6fd17f80277"
64+
}
65+
],
66+
"configurations" : [
67+
"test"
68+
]
69+
},
70+
{
71+
"org" : "org.scalatest",
72+
"name" : "scalatest_2.12",
73+
"version" : "3.0.8",
74+
"artifacts" : [
75+
{
76+
"name" : "scalatest_2.12.jar",
77+
"hash" : "sha1:8493ffa579676977b810a7a9fdc23af9d3c8af7f"
78+
}
79+
],
80+
"configurations" : [
81+
"test"
82+
]
83+
}
84+
]
85+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
sbt.version=1.7.1
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
val pluginVersion = System.getProperty("plugin.version")
3+
if (pluginVersion == null)
4+
throw new RuntimeException("""|The system property 'plugin.version' is not defined.
5+
|Specify this property using the scriptedLaunchOpts -D.""".stripMargin)
6+
else addSbtPlugin("software.purpledragon" % "sbt-dependency-lock" % pluginVersion)
7+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
> dependencyLockCheck
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
scalaVersion := "2.12.10"
2+
3+
libraryDependencies ++= Seq(
4+
"org.apache.commons" % "commons-lang3" % "3.9",
5+
"org.scalatest" %% "scalatest" % "3.0.8" % Test,
6+
)
7+
8+
// One ineffective filter and one for the org.scalatest organization.
9+
dependencyLockModuleFilter := moduleFilter(organization = "org.fake") | moduleFilter(organization = "org.scalatest")
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
{
2+
"lockVersion" : 1,
3+
"timestamp" : "2022-08-11T18:02:07.891395Z",
4+
"configurations" : [
5+
"compile",
6+
"optional",
7+
"provided",
8+
"runtime",
9+
"test"
10+
],
11+
"dependencies" : [
12+
{
13+
"org" : "org.apache.commons",
14+
"name" : "commons-lang3",
15+
"version" : "3.9",
16+
"artifacts" : [
17+
{
18+
"name" : "commons-lang3.jar",
19+
"hash" : "sha1:0122c7cee69b53ed4a7681c03d4ee4c0e2765da5"
20+
}
21+
],
22+
"configurations" : [
23+
"compile",
24+
"runtime",
25+
"test"
26+
]
27+
},
28+
{
29+
"org" : "org.scala-lang",
30+
"name" : "scala-library",
31+
"version" : "2.12.10",
32+
"artifacts" : [
33+
{
34+
"name" : "scala-library.jar",
35+
"hash" : "sha1:3509860bc2e5b3da001ed45aca94ffbe5694dbda"
36+
}
37+
],
38+
"configurations" : [
39+
"compile",
40+
"runtime",
41+
"test"
42+
]
43+
},
44+
{
45+
"org" : "org.scala-lang",
46+
"name" : "scala-reflect",
47+
"version" : "2.12.10",
48+
"artifacts" : [
49+
{
50+
"name" : "scala-reflect.jar",
51+
"hash" : "sha1:14cb7beb516cd8e07716133668c427792122c926"
52+
}
53+
],
54+
"configurations" : [
55+
"test"
56+
]
57+
},
58+
{
59+
"org" : "org.scala-lang.modules",
60+
"name" : "scala-xml_2.12",
61+
"version" : "1.2.0",
62+
"artifacts" : [
63+
{
64+
"name" : "scala-xml_2.12.jar",
65+
"hash" : "sha1:5d38ac30beb8420dd395c0af447ba412158965e6"
66+
}
67+
],
68+
"configurations" : [
69+
"test"
70+
]
71+
},
72+
{
73+
"org" : "org.scalactic",
74+
"name" : "scalactic_2.12",
75+
"version" : "3.0.8",
76+
"artifacts" : [
77+
{
78+
"name" : "scalactic_2.12.jar",
79+
"hash" : "sha1:b50559dfc4a691c1089f9c8812e1d6fd17f80277"
80+
}
81+
],
82+
"configurations" : [
83+
"test"
84+
]
85+
}
86+
]
87+
}

0 commit comments

Comments
 (0)