Skip to content

Commit 465aaa0

Browse files
authored
Add facility to check lockfile after update (#8)
1 parent 5157549 commit 465aaa0

File tree

41 files changed

+830
-3
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+830
-3
lines changed

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

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ package software.purpledragon.sbt.lock
1818

1919
import sbt.Keys._
2020
import sbt._
21+
import sbt.internal.util.ManagedLogger
22+
import software.purpledragon.sbt.lock.DependencyLockUpdateMode._
2123
import software.purpledragon.sbt.lock.model.{DependencyLockFile, LockFileMatches}
2224

2325
object DependencyLockPlugin extends AutoPlugin {
@@ -29,12 +31,20 @@ object DependencyLockPlugin extends AutoPlugin {
2931
val dependencyLockRead = taskKey[Option[DependencyLockFile]]("read dependencies from lock file")
3032

3133
val dependencyLockCheck = taskKey[Unit]("check if dependency lock is up to date")
34+
35+
val DependencyLockUpdateMode: software.purpledragon.sbt.lock.DependencyLockUpdateMode.type =
36+
software.purpledragon.sbt.lock.DependencyLockUpdateMode
37+
val dependencyLockAutoCheck = settingKey[DependencyLockUpdateMode]("automatically check lock file after update")
3238
}
3339

3440
import autoImport._
3541

42+
// task names to skip auto-check if we're inside of
43+
private val PluginTasks = Seq("dependencyLockWrite", "dependencyLockCheck", "dependencyLockRead")
44+
3645
override def projectSettings: Seq[Def.Setting[_]] = Seq(
3746
dependencyLockFile := baseDirectory.value / "build.sbt.lock",
47+
dependencyLockAutoCheck := DependencyLockUpdateMode.WarnOnError,
3848
dependencyLockWrite := {
3949
val dest = dependencyLockFile.value
4050
val updateReport = update.value
@@ -49,8 +59,8 @@ object DependencyLockPlugin extends AutoPlugin {
4959
deps
5060
},
5161
dependencyLockCheck := {
52-
val logger = streams.value.log
53-
val updateReport = update.value
62+
val logger: ManagedLogger = streams.value.log
63+
val updateReport: UpdateReport = update.value
5464

5565
val currentFile = dependencyLockRead.value.getOrElse(sys.error("no lock file"))
5666
val updatedFile = DependencyUtils.resolve(updateReport, thisProject.value.configurations.map(_.toConfigRef))
@@ -63,6 +73,47 @@ object DependencyLockPlugin extends AutoPlugin {
6373
logger.warn(changes.toShortReport)
6474
sys.error(changes.toLongReport)
6575
}
66-
}
76+
},
77+
update := Def.taskDyn {
78+
val report = update.value
79+
val logger = streams.value.log
80+
81+
82+
// check to see if the current command/task is one of our internal ones
83+
val skipCheck = state.value.currentCommand.map(_.commandLine).exists(PluginTasks.contains)
84+
val checkMode = dependencyLockAutoCheck.value
85+
86+
if (checkMode != DependencyLockUpdateMode.CheckDisabled && !skipCheck) {
87+
logger.debug("Automatically checking lockfile")
88+
89+
dependencyLockRead.value match {
90+
case Some(currentFile) =>
91+
val updatedFile = DependencyUtils.resolve(report, thisProject.value.configurations.map(_.toConfigRef))
92+
93+
val changes = currentFile.findChanges(updatedFile)
94+
95+
(changes, checkMode) match {
96+
case (LockFileMatches, _) =>
97+
// check passed
98+
case (_, WarnOnError) =>
99+
logger.warn("Dependency lock file is outdated - please run `dependencyLockCheck` for details")
100+
case (_, FailOnError) =>
101+
logger.error("Dependency lock file is outdated")
102+
sys.error(changes.toLongReport)
103+
104+
case _ =>
105+
// scenario shouldn't happen - failed check, but we're not checking...
106+
}
107+
108+
case None =>
109+
logger.warn("no lockfile found - please run dependencyLockWrite")
110+
}
111+
}
112+
113+
// return the original report
114+
Def.task {
115+
report
116+
}
117+
}.value
67118
)
68119
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright 2019 Michael Stringer
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package software.purpledragon.sbt.lock
18+
19+
object DependencyLockUpdateMode extends Enumeration {
20+
type DependencyLockUpdateMode = Value
21+
22+
val CheckDisabled, WarnOnError, FailOnError = Value
23+
}

0 commit comments

Comments
 (0)