Skip to content

Commit e4972aa

Browse files
authored
Merge pull request #76 from rubensousa/cache-hit-fix
Use gradle providers to pass extension properties and the dependencies
2 parents a171981 + db9b15a commit e4972aa

File tree

7 files changed

+95
-30
lines changed

7 files changed

+95
-30
lines changed

projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardExtension.kt

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import org.gradle.api.artifacts.MinimalExternalModuleDependency
3333
import org.gradle.api.model.ObjectFactory
3434
import org.gradle.api.provider.Provider
3535
import org.gradle.kotlin.dsl.listProperty
36+
import org.gradle.kotlin.dsl.property
3637
import javax.inject.Inject
3738

3839
abstract class ProjectGuardExtension @Inject constructor(
@@ -42,10 +43,8 @@ abstract class ProjectGuardExtension @Inject constructor(
4243
private val guardSpecs = objects.listProperty<GuardSpec>()
4344
private val moduleRestrictionSpecs = objects.listProperty<ModuleRestrictionSpec>()
4445
private val dependencyRestrictionSpecs = objects.listProperty<DependencyRestrictionSpec>()
45-
private var reportSpec = ReportSpec(showLibrariesInGraph = false)
46-
private var options = PluginOptions(
47-
lifecycleTask = null
48-
)
46+
private val reportSpec = objects.property<ReportSpec>().convention(ReportSpec(showLibrariesInGraph = false))
47+
private val options = objects.property<PluginOptions>().convention(PluginOptions(lifecycleTask = null))
4948

5049
override fun restrictModule(modulePath: String, action: Action<ModuleRestrictionScope>) {
5150
val scope = ModuleRestrictionScopeImpl()
@@ -127,26 +126,22 @@ abstract class ProjectGuardExtension @Inject constructor(
127126
override fun report(action: Action<ReportScope>) {
128127
val scope = ReportScopeImpl()
129128
action.execute(scope)
130-
reportSpec = reportSpec.copy(
131-
showLibrariesInGraph = scope.showLibrariesInGraph
132-
)
129+
reportSpec.set(ReportSpec(showLibrariesInGraph = scope.showLibrariesInGraph))
133130
}
134131

135132
override fun options(action: Action<OptionScope>) {
136133
val scope = OptionScopeImpl()
137134
action.execute(scope)
138-
options = options.copy(
139-
lifecycleTask = scope.lifecycleTask,
140-
)
135+
options.set(PluginOptions(lifecycleTask = scope.lifecycleTask))
141136
}
142137

143138
internal fun getSpec(): ProjectGuardSpec {
144139
return ProjectGuardSpec(
145140
guardSpecs = guardSpecs.get(),
146141
moduleRestrictionSpecs = moduleRestrictionSpecs.get(),
147142
dependencyRestrictionSpecs = dependencyRestrictionSpecs.get(),
148-
reportSpec = reportSpec,
149-
options = options
143+
reportSpec = reportSpec.get(),
144+
options = options.get()
150145
)
151146
}
152147

projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardPlugin.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ class ProjectGuardPlugin : Plugin<Project> {
292292
) {
293293
group = "verification"
294294
description = "Verifies if there are any dependency restrictions"
295-
reportSpec.set(extension.getSpec().reportSpec)
295+
pluginSpec.set(project.provider { extension.getSpec() })
296296
outputs.upToDateWhen { false }
297297
}
298298
}
@@ -307,7 +307,7 @@ class ProjectGuardPlugin : Plugin<Project> {
307307
) {
308308
group = "verification"
309309
description = "Verifies if there are any dependency restrictions"
310-
reportSpec.set(extension.getSpec().reportSpec)
310+
pluginSpec.set(project.provider { extension.getSpec() })
311311
outputs.upToDateWhen { false }
312312
}
313313
}
@@ -323,7 +323,7 @@ class ProjectGuardPlugin : Plugin<Project> {
323323
group = "other"
324324
description = "Generates a JSON report of all dependency restrictions for this module."
325325
projectPath.set(project.path)
326-
specProperty.set(extension.getSpec())
326+
specProperty.set(project.provider { extension.getSpec() })
327327
outputFile.set(
328328
project.layout.buildDirectory.file(jsonReportFilePath)
329329
)
@@ -340,7 +340,7 @@ class ProjectGuardPlugin : Plugin<Project> {
340340
group = "other"
341341
description = "Generates a JSON containing the dependencies of this module."
342342
projectPath.set(project.path)
343-
dependencyGraph.set(graphBuilder.buildFromProject(project))
343+
dependencyGraph.set(project.provider { graphBuilder.buildFromProject(project) })
344344
outputFile.set(
345345
project.layout.buildDirectory.file(dependenciesFilePath)
346346
)

projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/internal/task/TaskAggregateDependencyDump.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,13 @@ import kotlinx.serialization.json.Json
2323
import org.gradle.api.DefaultTask
2424
import org.gradle.api.file.ConfigurableFileCollection
2525
import org.gradle.api.file.RegularFileProperty
26-
import org.gradle.api.tasks.CacheableTask
2726
import org.gradle.api.tasks.InputFiles
2827
import org.gradle.api.tasks.OutputFile
2928
import org.gradle.api.tasks.PathSensitive
3029
import org.gradle.api.tasks.PathSensitivity
3130
import org.gradle.api.tasks.TaskAction
3231
import java.io.File
3332

34-
@CacheableTask
3533
internal abstract class TaskAggregateDependencyDump : DefaultTask() {
3634

3735
@get:InputFiles

projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/internal/task/TaskAggregateRestrictionDump.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,13 @@ import kotlinx.serialization.json.Json
2323
import org.gradle.api.DefaultTask
2424
import org.gradle.api.file.ConfigurableFileCollection
2525
import org.gradle.api.file.RegularFileProperty
26-
import org.gradle.api.tasks.CacheableTask
2726
import org.gradle.api.tasks.InputFiles
2827
import org.gradle.api.tasks.OutputFile
2928
import org.gradle.api.tasks.PathSensitive
3029
import org.gradle.api.tasks.PathSensitivity
3130
import org.gradle.api.tasks.TaskAction
3231
import java.io.File
3332

34-
@CacheableTask
3533
internal abstract class TaskAggregateRestrictionDump : DefaultTask() {
3634

3735
@get:InputFiles

projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/internal/task/TaskCheck.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package com.rubensousa.projectguard.plugin.internal.task
1818

1919
import com.rubensousa.projectguard.plugin.internal.BaselineConfiguration
2020
import com.rubensousa.projectguard.plugin.internal.DependencyGraphBuilder
21+
import com.rubensousa.projectguard.plugin.internal.ProjectGuardSpec
2122
import com.rubensousa.projectguard.plugin.internal.ReportSpec
2223
import com.rubensousa.projectguard.plugin.internal.SuppressionMap
2324
import com.rubensousa.projectguard.plugin.internal.YamlProcessor
@@ -54,7 +55,7 @@ internal abstract class TaskCheck : DefaultTask() {
5455
internal abstract val reportFilePath: Property<String>
5556

5657
@get:Input
57-
internal abstract val reportSpec: Property<ReportSpec>
58+
internal abstract val pluginSpec: Property<ProjectGuardSpec>
5859

5960
@get:OutputDirectory
6061
abstract val outputDir: DirectoryProperty
@@ -67,7 +68,7 @@ internal abstract class TaskCheck : DefaultTask() {
6768
dependenciesFile = dependenciesFile.get().asFile,
6869
reportDir = outputDir.get().asFile,
6970
reportFilePath = reportFilePath.get(),
70-
reportSpec = reportSpec.get()
71+
reportSpec = pluginSpec.get().reportSpec
7172
)
7273
executor.execute().getOrThrow()
7374
}

projectguard/src/test/kotlin/com/rubensousa/projectguard/plugin/PluginCacheTest.kt

Lines changed: 67 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package com.rubensousa.projectguard.plugin
1919
import com.google.common.truth.Truth.assertThat
2020
import org.gradle.testkit.runner.TaskOutcome
2121
import org.junit.Before
22+
import org.junit.Ignore
2223
import org.junit.Rule
2324
import org.junit.Test
2425
import org.junit.rules.TemporaryFolder
@@ -50,18 +51,36 @@ class PluginCacheTest {
5051
}
5152

5253
@Test
53-
fun `outputs from projectGuardDependencyDump are re-used`() {
54+
fun `outputs from projectGuardDependencyDump are up-to-date on next execution`() {
5455
// given
5556
pluginRunner.createModule("a")
5657
pluginRunner.createModule("b")
5758
pluginRunner.addDependency(from = "a", to = "b")
5859
val libraryDependencyTask = ":b:projectGuardDependencyDump"
60+
pluginRunner.runTask(libraryDependencyTask)
5961

6062
// when
63+
val nextResult = pluginRunner.runTask(libraryDependencyTask)
64+
65+
// then
66+
assertThat(nextResult).isEqualTo(TaskOutcome.UP_TO_DATE)
67+
}
68+
69+
@Test
70+
fun `outputs from projectGuardDependencyDump are re-used from cache`() {
71+
// given
72+
pluginRunner.createModule("a")
73+
pluginRunner.createModule("b")
74+
pluginRunner.addDependency(from = "a", to = "b")
75+
val libraryDependencyTask = ":b:projectGuardDependencyDump"
6176
pluginRunner.runTask(libraryDependencyTask)
6277

78+
// when
79+
pluginRunner.deleteBuildDirs()
80+
val result = pluginRunner.runTask(libraryDependencyTask)
81+
6382
// then
64-
assertThat(pluginRunner.runTask(libraryDependencyTask)).isEqualTo(TaskOutcome.UP_TO_DATE)
83+
assertThat(result).isEqualTo(TaskOutcome.FROM_CACHE)
6584
}
6685

6786
@Test
@@ -76,24 +95,45 @@ class PluginCacheTest {
7695

7796
// when
7897
pluginRunner.addDependency(from = "b", to = "c")
98+
pluginRunner.deleteBuildDirs()
99+
val result = pluginRunner.runTask(libraryDependencyTask)
79100

80101
// then
81-
assertThat(pluginRunner.runTask(libraryDependencyTask)).isEqualTo(TaskOutcome.SUCCESS)
102+
assertThat(result).isEqualTo(TaskOutcome.SUCCESS)
82103
}
83104

84105
@Test
85-
fun `outputs from projectGuardAggregateDependencyDump are re-used`() {
106+
fun `outputs from projectGuardAggregateDependencyDump are up-to-date on next execution`() {
86107
// given
87108
pluginRunner.createModule("a")
88109
pluginRunner.createModule("b")
89110
pluginRunner.addDependency(from = "a", to = "b")
90111
val task = ":projectGuardAggregateDependencyDump"
112+
pluginRunner.runTask(task)
91113

92114
// when
115+
val result = pluginRunner.runTask(task)
116+
117+
// then
118+
assertThat(result).isEqualTo(TaskOutcome.UP_TO_DATE)
119+
}
120+
121+
@Ignore("Not working for now")
122+
@Test
123+
fun `outputs from projectGuardAggregateDependencyDump are re-used from cache`() {
124+
// given
125+
pluginRunner.createModule("a")
126+
pluginRunner.createModule("b")
127+
pluginRunner.addDependency(from = "a", to = "b")
128+
val task = ":projectGuardAggregateDependencyDump"
93129
pluginRunner.runTask(task)
94130

131+
// when
132+
pluginRunner.deleteBuildDirs()
133+
val result = pluginRunner.runTask(task)
134+
95135
// then
96-
assertThat(pluginRunner.runTask(task)).isEqualTo(TaskOutcome.UP_TO_DATE)
136+
assertThat(result).isEqualTo(TaskOutcome.FROM_CACHE)
97137
}
98138

99139
@Test
@@ -114,18 +154,36 @@ class PluginCacheTest {
114154
}
115155

116156
@Test
117-
fun `outputs from projectGuardRestrictionDump are re-used if nothing changed`() {
157+
fun `outputs from projectGuardRestrictionDump are up-to-date if nothing changed`() {
118158
// given
119159
pluginRunner.createModule("a")
120160
pluginRunner.createModule("b")
121161
pluginRunner.addDependency(from = "a", to = "b")
122162
val task = ":a:projectGuardRestrictionDump"
163+
pluginRunner.runTask(task)
123164

124165
// when
166+
val result = pluginRunner.runTask(task)
167+
168+
// then
169+
assertThat(result).isEqualTo(TaskOutcome.UP_TO_DATE)
170+
}
171+
172+
@Test
173+
fun `outputs from projectGuardRestrictionDump are cached`() {
174+
// given
175+
pluginRunner.createModule("a")
176+
pluginRunner.createModule("b")
177+
pluginRunner.addDependency(from = "a", to = "b")
178+
val task = ":a:projectGuardRestrictionDump"
125179
pluginRunner.runTask(task)
126180

181+
// when
182+
pluginRunner.deleteBuildDirs()
183+
val result = pluginRunner.runTask(task)
184+
127185
// then
128-
assertThat(pluginRunner.runTask(task)).isEqualTo(TaskOutcome.UP_TO_DATE)
186+
assertThat(result).isEqualTo(TaskOutcome.FROM_CACHE)
129187
}
130188

131189
@Test
@@ -140,6 +198,7 @@ class PluginCacheTest {
140198

141199
// when
142200
pluginRunner.addDependency(from = "b", to = "c")
201+
pluginRunner.deleteBuildDirs()
143202

144203
// then
145204
assertThat(pluginRunner.runTask(task)).isEqualTo(TaskOutcome.SUCCESS)
@@ -162,6 +221,7 @@ class PluginCacheTest {
162221
}
163222
""".trimIndent()
164223
)
224+
pluginRunner.deleteBuildDirs()
165225

166226
// then
167227
assertThat(pluginRunner.runTask(task)).isEqualTo(TaskOutcome.SUCCESS)

projectguard/src/test/kotlin/com/rubensousa/projectguard/plugin/PluginRunner.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,24 @@ class PluginRunner(
3434
.withGradleVersion("8.13")
3535
}
3636
private var lastResult: BuildResult? = null
37+
private val modules = mutableListOf<String>()
3738

3839
fun createModule(name: String) {
3940
temporaryFolder.newFolder(name)
4041
temporaryFolder.newFile("$name/build.gradle.kts")
4142
settingsFile.appendText("\ninclude(\":$name\")")
43+
modules.add(name)
44+
}
45+
46+
fun deleteBuildDirs() {
47+
modules.forEach { module ->
48+
temporaryFolder.getRoot()
49+
.resolve("$module/build/")
50+
.deleteRecursively()
51+
}
52+
temporaryFolder.getRoot()
53+
.resolve("build")
54+
.deleteRecursively()
4255
}
4356

4457
fun assertProjectGuardCheckFails(module: String) {
@@ -72,7 +85,7 @@ class PluginRunner(
7285
}
7386

7487
fun runTask(task: String): TaskOutcome {
75-
val result = gradleRunner.withArguments(task).build()
88+
val result = gradleRunner.withArguments("--build-cache", task).build()
7689
lastResult = result
7790
return result.task(task)!!.outcome
7891
}

0 commit comments

Comments
 (0)