@@ -18,6 +18,8 @@ package software.purpledragon.sbt.lock
1818
1919import sbt .Keys ._
2020import sbt ._
21+ import sbt .internal .util .ManagedLogger
22+ import software .purpledragon .sbt .lock .DependencyLockUpdateMode ._
2123import software .purpledragon .sbt .lock .model .{DependencyLockFile , LockFileMatches }
2224
2325object 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}
0 commit comments