diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/IncrementalManager.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/IncrementalManager.kt index d6857e3e..a6df859a 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/IncrementalManager.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/IncrementalManager.kt @@ -82,7 +82,8 @@ class IncrementalManager(val fileName: String = IncrementalManager.BUILD_INFO_FI var upToDate = false var taskOutputChecksum : String? = null inputChecksumFor(taskName)?.let { inputChecksum -> - if (inputChecksum == iit.inputChecksum) { + val dependsOnDirtyProjects = project.projectInfo.dependsOnDirtyProjects(project) + if (inputChecksum == iit.inputChecksum && ! dependsOnDirtyProjects) { outputChecksumFor(taskName)?.let { outputChecksum -> taskOutputChecksum = iit.outputChecksum() if (outputChecksum == taskOutputChecksum) { @@ -92,8 +93,13 @@ class IncrementalManager(val fileName: String = IncrementalManager.BUILD_INFO_FI } } } else { - logIncremental(2, "Incremental task $taskName input is out of date, running it" - + " old: $inputChecksum new: ${iit.inputChecksum}") + if (dependsOnDirtyProjects) { + logIncremental(2, "Project ${project.name} depends on dirty project, running $taskName") + } else { + logIncremental(2, "Incremental task $taskName input is out of date, running it" + + " old: $inputChecksum new: ${iit.inputChecksum}") + } + project.projectInfo.isDirty = true } } if (! upToDate) { diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/ProjectInfo.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/ProjectInfo.kt index c0ae052f..300be5a2 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/ProjectInfo.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/ProjectInfo.kt @@ -28,6 +28,13 @@ interface IProjectInfo { * The list of projects that this project depends on */ val dependsOn: ArrayList + + var isDirty: Boolean + + /** + * @return true if any of the projects we depend on is dirty. + */ + fun dependsOnDirtyProjects(project: Project) = project.projectInfo.dependsOn.any { it.projectInfo.isDirty } } abstract class BaseProjectInfo : IProjectInfo { @@ -43,4 +50,6 @@ abstract class BaseProjectInfo : IProjectInfo { } override val dependsOn = arrayListOf() + + override var isDirty = false }