diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt index 20f2b18c2ef..83ba4d3ac61 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.gradle import org.gradle.api.logging.LogLevel +import org.jetbrains.kotlin.com.intellij.openapi.util.io.FileUtil import org.jetbrains.kotlin.gradle.tasks.USING_EXPERIMENTAL_INCREMENTAL_MESSAGE import org.jetbrains.kotlin.gradle.util.getFileByName import org.jetbrains.kotlin.gradle.util.getFilesByNames @@ -48,6 +49,29 @@ class KotlinGradleIT: BaseGradleIT() { } } + @Test + fun testRunningInDifferentDir() { + val wd0 = workingDir + val wd1 = File(wd0, "subdir").apply { mkdirs() } + workingDir = wd1 + val project1 = Project("kotlinJavaProject", "3.3") + + project1.build("assemble") { + assertSuccessful() + } + + val wd2 = FileUtil.createTempDirectory("testRunningInDifferentDir", null) + wd1.copyRecursively(wd2) + wd1.deleteRecursively() + assert(!wd1.exists()) + wd0.setWritable(false) + workingDir = wd2 + + project1.build("test") { + assertSuccessful() + } + } + @Test fun testKotlinOnlyCompile() { val project = Project("kotlinProject", GRADLE_VERSION) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SyncOutputTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SyncOutputTask.kt index c1676a675d5..cb6235f0644 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SyncOutputTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SyncOutputTask.kt @@ -16,11 +16,9 @@ package org.jetbrains.kotlin.gradle.tasks -import ch.qos.logback.core.util.FileUtil import org.gradle.api.DefaultTask import org.gradle.api.tasks.InputFiles import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.OutputFiles import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.incremental.IncrementalTaskInputs import org.gradle.api.tasks.incremental.InputFileDetails @@ -70,19 +68,32 @@ internal open class SyncOutputTask : DefaultTask() { // OutputDirectory needed for task to be incremental @get:OutputDirectory val workingDir: File by lazy { - File(kotlinTask.taskBuildDirectory, "sync").apply { mkdirs() } + File(kotlinTask.taskBuildDirectory, "sync") } private val timestampsFile: File by lazy { File(workingDir, TIMESTAMP_FILE_NAME) } private val timestamps: MutableMap by lazy { - readTimestamps(timestampsFile) + readTimestamps(timestampsFile, javaOutputDir) } - @Suppress("unused") - @get:OutputFiles - val kotlinClassesInJavaOutputDir: Collection - get() = timestamps.keys + init { + outputs.upToDateWhen { + for ((file, ts) in timestamps) { + if (!file.exists()) { + logger.kotlinDebug { "$file does not exist" } + return@upToDateWhen false + } + + if (file.lastModified() != ts) { + logger.kotlinDebug { "$file ts is different" } + return@upToDateWhen false + } + } + + return@upToDateWhen true + } + } @Suppress("unused") @TaskAction @@ -98,7 +109,7 @@ internal open class SyncOutputTask : DefaultTask() { processNonIncrementally() } - saveTimestamps(timestampsFile, timestamps) + saveTimestamps(timestampsFile, timestamps, javaOutputDir) } private fun processNonIncrementally() { @@ -166,24 +177,24 @@ internal open class SyncOutputTask : DefaultTask() { private val TIMESTAMP_FILE_NAME = "kotlin-files-in-java-timestamps.bin" -private fun readTimestamps(file: File): MutableMap { +private fun readTimestamps(tsFile: File, filesBaseDir: File): MutableMap { val result = HashMap() - if (!file.isFile) return result + if (!tsFile.isFile) return result - ObjectInputStream(file.inputStream()).use { input -> + ObjectInputStream(tsFile.inputStream()).use { input -> val size = input.readInt() repeat(size) { val path = input.readUTF() val timestamp = input.readLong() - result[File(path)] = timestamp + result[File(filesBaseDir, path)] = timestamp } } return result } -private fun saveTimestamps(snapshotFile: File, timestamps: Map) { +private fun saveTimestamps(snapshotFile: File, timestamps: Map, filesBaseDir: File) { if (!snapshotFile.exists()) { snapshotFile.parentFile.mkdirs() snapshotFile.createNewFile() @@ -196,7 +207,7 @@ private fun saveTimestamps(snapshotFile: File, timestamps: Map) { out.writeInt(timestamps.size) for ((file, timestamp) in timestamps) { - out.writeUTF(file.canonicalPath) + out.writeUTF(file.relativeTo(filesBaseDir).path) out.writeLong(timestamp) } }