Skip to content

Commit a8851fe

Browse files
author
Denis Mikhaylov
committed
Implement changedProjectsInCompile
1 parent ab7f9c3 commit a8851fe

File tree

6 files changed

+65
-20
lines changed

6 files changed

+65
-20
lines changed

src/main/scala/com/elarib/PartialSbtPlugin.scala

Lines changed: 49 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import org.apache.logging.log4j.LogManager
55
import sbt.*
66
import sbt.Keys.*
77
import sbt.internal.BuildDependencies.DependencyMap
8+
import sbt.internal.{BuildDependencies, LoadedBuild}
89

910
object BuildKeys {
1011
val partialSbtExcludedFiles = sbt.settingKey[Seq[sbt.File]]("Files that should be excluded from analysis.")
@@ -38,6 +39,40 @@ object PartialSbtPlugin extends AutoPlugin {
3839
BuildKeys.partialSbtExcludedFiles := Def.setting(List.empty[sbt.File]).value
3940
)
4041

42+
private def hasCompileConfiguration[A <: ProjectReference](dep: ClasspathDep[A]): Boolean =
43+
dep.configuration.fold(true)(value => value.contains("compile->") || value == "compile")
44+
45+
private def changedProjectsCommand(name: String)(
46+
buildDependencies: BuildDependencies,
47+
baseDirectory: File,
48+
loadedBuild: LoadedBuild,
49+
partialSbtExcludedFiles: Seq[File],
50+
dependencyFilter: ClasspathDep[ProjectRef] => Boolean
51+
) =
52+
Command(name)(_ => PartialSbParser.changeGetterParser)((st, changeGetter) => {
53+
54+
val compileDependencyMap: DependencyMap[ClasspathDep[ProjectRef]] =
55+
buildDependencies.classpath.mapValues(_.filter(dependencyFilter))
56+
57+
val transitiveCompileDependencyMap =
58+
BuildDependencies.transitive(compileDependencyMap, BuildDependencies.getID)
59+
60+
val changedProjects: Seq[ResolvedProject] =
61+
findChangedModules(changeGetter)(
62+
baseDirectory,
63+
loadedBuild.allProjectRefs,
64+
transitiveCompileDependencyMap,
65+
partialSbtExcludedFiles
66+
)
67+
68+
logger.debug(s"${changedProjects.size} projects have been changed")
69+
70+
changedProjects.foreach { resolvedProject =>
71+
logger.debug(resolvedProject.id)
72+
}
73+
st
74+
})
75+
4176
override def projectSettings: Seq[Def.Setting[_]] =
4277
Seq(
4378
commands += Command("metaBuildChangedFiles")(_ => PartialSbParser.changeGetterParser)((st, changeGetter) => {
@@ -51,23 +86,20 @@ object PartialSbtPlugin extends AutoPlugin {
5186
}
5287
st
5388
}),
54-
commands += Command("changedProjects")(_ => PartialSbParser.changeGetterParser)((st, changeGetter) => {
55-
56-
val changedProjects: Seq[ResolvedProject] =
57-
findChangedModules(changeGetter)(
58-
baseDirectory.value,
59-
loadedBuild.value.allProjectRefs,
60-
buildDependencies.value.classpathTransitive,
61-
BuildKeys.partialSbtExcludedFiles.value
62-
)
63-
64-
logger.debug(s"${changedProjects.size} projects have been changed")
65-
66-
changedProjects.foreach { resolvedProject =>
67-
logger.debug(resolvedProject.id)
68-
}
69-
st
70-
})
89+
commands += changedProjectsCommand("changedProjects")(
90+
buildDependencies.value,
91+
baseDirectory.value,
92+
loadedBuild.value,
93+
BuildKeys.partialSbtExcludedFiles.value,
94+
Function.const(true)
95+
),
96+
commands += changedProjectsCommand("changedProjectsInCompile")(
97+
buildDependencies.value,
98+
baseDirectory.value,
99+
loadedBuild.value,
100+
BuildKeys.partialSbtExcludedFiles.value,
101+
hasCompileConfiguration
102+
)
71103
)
72104

73105
private def findChangedModules(changeGetter: ChangeGetter)(

src/sbt-test/test-projects/multi-module-project/build.sbt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,4 +121,8 @@ lazy val thirdService = sbt
121121
lazy val fourthService = sbt
122122
.Project("service-4", service / "service-4")
123123
.dependsOn(firstTool, secondTool)
124+
.dependsOn(testKit % Test)
124125
.settings(settings("service-4"))
126+
127+
lazy val testKit = sbt
128+
.Project("testKit", libs / "testKit")
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
src/libs/testKit/build.sbt

src/sbt-test/test-projects/multi-module-project/expected/5.log

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
Metabuild files have changed. Need to reload all the 11 projects
2-
11 projects have been changed
1+
Metabuild files have changed. Need to reload all the 12 projects
2+
12 projects have been changed
33
lib-1
44
lib-2
55
multi-module-project
66
service-1
77
service-2
88
service-3
99
service-4
10+
testKit
1011
tool-1
1112
tool-2
1213
tool-3
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
1 projects have been changed
2+
testKit

src/sbt-test/test-projects/multi-module-project/test

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,9 @@ $ must-mirror ./result4.log ./expected/4.log
2323
> reload
2424
> addEnvVar PARTIAL_SBT_LOG_PATH result5.log
2525
> changedProjects dummyChanges ./changes/5.log
26-
$ must-mirror ./result5.log ./expected/5.log
26+
$ must-mirror ./result5.log ./expected/5.log
27+
# 6th test
28+
> reload
29+
> addEnvVar PARTIAL_SBT_LOG_PATH result6.log
30+
> changedProjectsInCompile dummyChanges ./changes/6.log
31+
$ must-mirror ./result6.log ./expected/6.log

0 commit comments

Comments
 (0)