Skip to content

Commit

Permalink
Implement changedProjectsInCompile
Browse files Browse the repository at this point in the history
  • Loading branch information
Denis Mikhaylov committed Aug 8, 2024
1 parent ab7f9c3 commit 8f18cc1
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 20 deletions.
68 changes: 51 additions & 17 deletions src/main/scala/com/elarib/PartialSbtPlugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@ import org.apache.logging.log4j.LogManager
import sbt.*
import sbt.Keys.*
import sbt.internal.BuildDependencies.DependencyMap
import sbt.internal.{BuildDependencies, LoadedBuild}

object BuildKeys {
val partialSbtExcludedFiles = sbt.settingKey[Seq[sbt.File]]("Files that should be excluded from analysis.")
val partialSbtOpaqueProject: SettingKey[Unit] =
sbt.settingKey[Unit]("Changes in this project will not contribute to invalidation of its dependent projects.")

val changedProjectsTask = sbt.taskKey[String]("List of projects that have been changed.")
}

object PartialSbtPlugin extends AutoPlugin {
Expand Down Expand Up @@ -38,6 +41,40 @@ object PartialSbtPlugin extends AutoPlugin {
BuildKeys.partialSbtExcludedFiles := Def.setting(List.empty[sbt.File]).value
)

private def hasCompileConfiguration[A <: ProjectReference](dep: ClasspathDep[A]): Boolean =
dep.configuration.fold(true)(value => value.contains("compile->") || value == "compile")

private def changedProjectsCommand(name: String)(
buildDependencies: BuildDependencies,
baseDirectory: File,
loadedBuild: LoadedBuild,
partialSbtExcludedFiles: Seq[File],
dependencyFilter: ClasspathDep[ProjectRef] => Boolean
) =
Command(name)(_ => PartialSbParser.changeGetterParser)((st, changeGetter) => {

val compileDependencyMap: DependencyMap[ClasspathDep[ProjectRef]] =
buildDependencies.classpath.mapValues(_.filter(dependencyFilter))

val transitiveCompileDependencyMap =
BuildDependencies.transitive(compileDependencyMap, BuildDependencies.getID)

val changedProjects: Seq[ResolvedProject] =
findChangedModules(changeGetter)(
baseDirectory,
loadedBuild.allProjectRefs,
transitiveCompileDependencyMap,
partialSbtExcludedFiles
)

logger.debug(s"${changedProjects.size} projects have been changed")

changedProjects.foreach { resolvedProject =>
logger.debug(resolvedProject.id)
}
st
})

override def projectSettings: Seq[Def.Setting[_]] =
Seq(
commands += Command("metaBuildChangedFiles")(_ => PartialSbParser.changeGetterParser)((st, changeGetter) => {
Expand All @@ -51,23 +88,20 @@ object PartialSbtPlugin extends AutoPlugin {
}
st
}),
commands += Command("changedProjects")(_ => PartialSbParser.changeGetterParser)((st, changeGetter) => {

val changedProjects: Seq[ResolvedProject] =
findChangedModules(changeGetter)(
baseDirectory.value,
loadedBuild.value.allProjectRefs,
buildDependencies.value.classpathTransitive,
BuildKeys.partialSbtExcludedFiles.value
)

logger.debug(s"${changedProjects.size} projects have been changed")

changedProjects.foreach { resolvedProject =>
logger.debug(resolvedProject.id)
}
st
})
commands += changedProjectsCommand("changedProjects")(
buildDependencies.value,
baseDirectory.value,
loadedBuild.value,
BuildKeys.partialSbtExcludedFiles.value,
Function.const(true)
),
commands += changedProjectsCommand("changedProjectsInCompile")(
buildDependencies.value,
baseDirectory.value,
loadedBuild.value,
BuildKeys.partialSbtExcludedFiles.value,
hasCompileConfiguration
)
)

private def findChangedModules(changeGetter: ChangeGetter)(
Expand Down
4 changes: 4 additions & 0 deletions src/sbt-test/test-projects/multi-module-project/build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -121,4 +121,8 @@ lazy val thirdService = sbt
lazy val fourthService = sbt
.Project("service-4", service / "service-4")
.dependsOn(firstTool, secondTool)
.dependsOn(testKit % Test)
.settings(settings("service-4"))

lazy val testKit = sbt
.Project("testKit", libs / "testKit")
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
Metabuild files have changed. Need to reload all the 11 projects
11 projects have been changed
Metabuild files have changed. Need to reload all the 12 projects
12 projects have been changed
lib-1
lib-2
multi-module-project
service-1
service-2
service-3
service-4
testKit
tool-1
tool-2
tool-3
Expand Down
7 changes: 6 additions & 1 deletion src/sbt-test/test-projects/multi-module-project/test
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,9 @@ $ must-mirror ./result4.log ./expected/4.log
> reload
> addEnvVar PARTIAL_SBT_LOG_PATH result5.log
> changedProjects dummyChanges ./changes/5.log
$ must-mirror ./result5.log ./expected/5.log
$ must-mirror ./result5.log ./expected/5.log
# 6th test
> reload
> addEnvVar PARTIAL_SBT_LOG_PATH result6.log
> changedProjectsInCompile dummyChanges ./changes/6.log
$ must-mirror ./result6.log ./expected/6.log

0 comments on commit 8f18cc1

Please sign in to comment.