Skip to content

Commit

Permalink
Merge pull request #22 from square/module-path
Browse files Browse the repository at this point in the history
Ensure proper ordering of Gradle Task Execution between "clean" and "collect" tasks.
  • Loading branch information
handstandsam authored Sep 4, 2024
2 parents ff9e078 + 65d729f commit 76ecc73
Showing 1 changed file with 127 additions and 112 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,127 +21,142 @@ import java.io.File
@Suppress("unused")
class InvertGradlePlugin : Plugin<Project> {

companion object {
const val ID = "com.squareup.invert"
companion object {
const val ID = "com.squareup.invert"
}

override fun apply(rootProject: Project): Unit = rootProject.run {
val extension = this.getInvertExtension()

if (!rootProject.isRootProject()) {
throw IllegalStateException("Cannot apply $ID to a non-root project")
}

val rootInvertCleanTask = registerInvertCleanTask(rootProject)
rootProject.afterEvaluate { rootProject ->
val subprojectsToRegisterOn = rootProject.subprojects
.filter { shouldRegisterOnSubproject(it, extension) }

val rootInvertTask = rootProject.tasks.register(
InvertTask.TASK_NAME,
InvertTask::class.java
) { reportTask ->
reportTask.setParams(
project = rootProject,
extension = project.getInvertExtension(),
subprojectInvertReportDirs = subprojectsToRegisterOn.map {
File(
it.layout.buildDirectory.get().asFile,
InvertFileUtils.REPORTS_SLASH_INVERT_PATH
).absolutePath
}
)
reportTask.mustRunAfter(rootInvertCleanTask)
}

subprojectsToRegisterOn.forEach { subproject ->
// Without evaluationDependsOn, subproject won't be configured to access the dependency graph.
rootProject.evaluationDependsOn(subproject.path)
registerOnSubproject(
subproject = subproject,
rootInvertTaskProvider = rootInvertTask,
rootInvertCleanTaskProvider = rootInvertCleanTask,
extension = extension
)
}
}
}

private fun shouldRegisterOnSubproject(
subproject: Project,
extension: InvertExtension
): Boolean {
if (hasBuildGradleFile(subproject)) {
return extension.getShouldIncludeSubprojectCalculator().invoke(subproject)
}
return false
}

private fun hasBuildGradleFile(subproject: Project): Boolean {
return subproject.file("build.gradle").exists() || subproject.file("build.gradle.kts").exists()
}

private fun registerInvertCleanTask(target: Project): TaskProvider<InvertCleanTask> {
return target.tasks.register(
InvertCleanTask.TASK_NAME,
InvertCleanTask::class.java
) { task ->
task.setParams(
project = target,
)
}
}

private fun registerOnSubproject(
subproject: Project,
rootInvertTaskProvider: TaskProvider<InvertTask>,
rootInvertCleanTaskProvider: TaskProvider<InvertCleanTask>,
extension: InvertExtension
) {
val subprojectCleanTask = registerInvertCleanTask(subproject)
rootInvertCleanTaskProvider.configure {
it.dependsOn(subprojectCleanTask)
}

val ownershipTask = subproject.tasks.register(
InvertCollectOwnershipTask.TASK_NAME,
InvertCollectOwnershipTask::class.java
) { task ->
task.setParams(
project = subproject,
extension = extension,
)
task.mustRunAfter(rootInvertCleanTaskProvider)
}

override fun apply(rootProject: Project): Unit = rootProject.run {
val extension = this.getInvertExtension()

if (!rootProject.isRootProject()) {
throw IllegalStateException("Cannot apply $ID to a non-root project")
}

val invertCleanTask = registerInvertCleanTask(rootProject)
rootProject.afterEvaluate { rootProject ->
val subprojectsToRegisterOn = rootProject.subprojects
.filter { shouldRegisterOnSubproject(it, extension) }

val rootInvertTask = rootProject.tasks.register(
InvertTask.TASK_NAME,
InvertTask::class.java
) { reportTask ->
reportTask.setParams(
project = rootProject,
extension = project.getInvertExtension(),
subprojectInvertReportDirs = subprojectsToRegisterOn.map {
File(
it.layout.buildDirectory.get().asFile,
InvertFileUtils.REPORTS_SLASH_INVERT_PATH
).absolutePath
}
)
}

subprojectsToRegisterOn.forEach { subproject ->
// Without evaluationDependsOn, subproject won't be configured to access the dependency graph.
rootProject.evaluationDependsOn(subproject.path)
registerOnSubproject(subproject, rootInvertTask, invertCleanTask, extension)
}
}
val collectStatsTask = subproject.tasks.register(
InvertCollectStatsTask.TASK_NAME,
InvertCollectStatsTask::class.java
) { task ->
task.setParams(
project = subproject,
extension = extension,
)
task.mustRunAfter(rootInvertCleanTaskProvider)
}

private fun shouldRegisterOnSubproject(
subproject: Project,
extension: InvertExtension
): Boolean {
if (hasBuildGradleFile(subproject)) {
return extension.getShouldIncludeSubprojectCalculator().invoke(subproject)
}
return false
val collectDependenciesTask = subproject.tasks.register(
InvertCollectDependenciesTask.TASK_NAME,
InvertCollectDependenciesTask::class.java
) { task ->
task.setParams(
project = subproject,
extension = extension,
)
task.mustRunAfter(rootInvertCleanTaskProvider)
}

private fun hasBuildGradleFile(subproject: Project): Boolean {
return subproject.file("build.gradle").exists() || subproject.file("build.gradle.kts").exists()
val subprojectCollectTask = subproject.tasks.register(
InvertCollectTask.TASK_NAME,
InvertCollectTask::class.java
) { collectTask ->
collectTask.setParams(
project = subproject,
)

collectTask.dependsOn(collectStatsTask)
collectTask.dependsOn(ownershipTask)
collectTask.dependsOn(collectDependenciesTask)
collectTask.mustRunAfter(rootInvertCleanTaskProvider)
collectTask.mustRunAfter(subprojectCleanTask)
}

private fun registerInvertCleanTask(target: Project): TaskProvider<InvertCleanTask> {
return target.tasks.register(
InvertCleanTask.TASK_NAME,
InvertCleanTask::class.java
) { task ->
task.setParams(
project = target,
)
}
rootInvertTaskProvider.configure { rootInvertTask ->
rootInvertTask.dependsOn(subprojectCollectTask)
}

private fun registerOnSubproject(
subproject: Project,
rootInvertTaskProvider: TaskProvider<InvertTask>,
rootInvertCleanTaskProvider: TaskProvider<InvertCleanTask>,
extension: InvertExtension
) {
val ownershipTask = subproject.tasks.register(
InvertCollectOwnershipTask.TASK_NAME,
InvertCollectOwnershipTask::class.java
) { task ->
task.setParams(
project = subproject,
extension = extension,
)
}

val collectStatsTask = subproject.tasks.register(
InvertCollectStatsTask.TASK_NAME,
InvertCollectStatsTask::class.java
) { task ->
task.setParams(
project = subproject,
extension = extension,
)
}

val collectDependenciesTask = subproject.tasks.register(
InvertCollectDependenciesTask.TASK_NAME,
InvertCollectDependenciesTask::class.java
) { task ->
task.setParams(
project = subproject,
extension = extension,
)
}

val subprojectCollectTask = subproject.tasks.register(
InvertCollectTask.TASK_NAME,
InvertCollectTask::class.java
) { collectTask ->
collectTask.setParams(
project = subproject,
)

collectTask.dependsOn(collectStatsTask)
collectTask.dependsOn(ownershipTask)
collectTask.dependsOn(collectDependenciesTask)
}

rootInvertTaskProvider.configure { rootInvertTask ->
rootInvertTask.dependsOn(subprojectCollectTask)
}

rootInvertCleanTaskProvider.configure { rootInvertCleanTask ->
val subprojectCleanTask = registerInvertCleanTask(subproject)
rootInvertCleanTask.dependsOn(subprojectCleanTask)
}
rootInvertCleanTaskProvider.configure { rootInvertCleanTask ->
rootInvertCleanTask.dependsOn(subprojectCleanTask)
}
}
}

0 comments on commit 76ecc73

Please sign in to comment.