diff --git a/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/PaparazziPlugin.kt b/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/PaparazziPlugin.kt index abc3b214a3..2c8643c19e 100644 --- a/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/PaparazziPlugin.kt +++ b/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/PaparazziPlugin.kt @@ -156,18 +156,24 @@ public class PaparazziPlugin : Plugin { task.targetSdkVersion.set(android.targetSdkVersion()) task.compileSdkVersion.set(android.compileSdkVersion()) task.projectResourceDirs.set( - project.provider { - val resourcesComputer = variant.mergeResourcesProvider?.get()?.resourcesComputer - val generateResValuesDirs = resourcesComputer?.generatedResOutputDir ?: project.files() - val extraGeneratedResDirs = resourcesComputer?.extraGeneratedResFolders ?: project.files() - - extraGeneratedResDirs.map(projectDirectory::relativize) + localResourceDirs.relativize(projectDirectory) + generateResValuesDirs.map(projectDirectory::relativize) + run { + val resourcesComputer = variant.mergeResourcesProvider + val extraGeneratedResDirs = + resourcesComputer?.map { it.resourcesComputer.extraGeneratedResFolders } + ?: project.provider { project.files() } + val generatedResOutputDirs = + resourcesComputer?.map { it.resourcesComputer.generatedResOutputDir } + ?: project.provider { project.files() } + extraGeneratedResDirs + .zip(project.provider { localResourceDirs }, FileCollection::plus) + .zip(generatedResOutputDirs, FileCollection::plus) + .flatMap { it.relativize(projectDirectory) } } ) - task.moduleResourceDirs.set(project.provider { moduleResourceDirs.relativize(projectDirectory) }) - task.aarExplodedDirs.set(project.provider { aarExplodedDirs.relativize(gradleHomeDir) }) - task.projectAssetDirs.set(project.provider { localAssetDirs.plus(moduleAssetDirs).relativize(projectDirectory) }) - task.aarAssetDirs.set(project.provider { aarAssetDirs.relativize(gradleHomeDir) }) + task.moduleResourceDirs.set(moduleResourceDirs.relativize(projectDirectory)) + task.aarExplodedDirs.set(aarExplodedDirs.relativize(gradleHomeDir)) + task.projectAssetDirs.set(localAssetDirs.plus(moduleAssetDirs).relativize(projectDirectory)) + task.aarAssetDirs.set(aarAssetDirs.relativize(gradleHomeDir)) task.paparazziResources.set(buildDirectory.file("intermediates/paparazzi/${variant.name}/resources.json")) } diff --git a/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/utils/FileUtils.kt b/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/utils/FileUtils.kt index a78374464d..1d2704eacf 100644 --- a/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/utils/FileUtils.kt +++ b/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/utils/FileUtils.kt @@ -17,9 +17,11 @@ package app.cash.paparazzi.gradle.utils import org.gradle.api.file.Directory import org.gradle.api.file.FileCollection +import org.gradle.api.provider.Provider import java.io.File -internal fun FileCollection.relativize(directory: Directory) = files.map(directory::relativize) +internal fun FileCollection.relativize(directory: Directory): Provider> = + elements.map { files -> files.map { file -> directory.relativize(file.asFile) } } internal fun Directory.relativize(child: File): String { return asFile.toPath().relativize(child.toPath()).toFile().invariantSeparatorsPath diff --git a/paparazzi-gradle-plugin/src/test/java/app/cash/paparazzi/gradle/PaparazziPluginTest.kt b/paparazzi-gradle-plugin/src/test/java/app/cash/paparazzi/gradle/PaparazziPluginTest.kt index 325912748e..06bfe84a2c 100644 --- a/paparazzi-gradle-plugin/src/test/java/app/cash/paparazzi/gradle/PaparazziPluginTest.kt +++ b/paparazzi-gradle-plugin/src/test/java/app/cash/paparazzi/gradle/PaparazziPluginTest.kt @@ -329,6 +329,17 @@ class PaparazziPluginTest { .runFixture(fixtureRoot) { build() } } + @Test + fun configurationCacheWorksWithGeneratedSources() { + val fixtureRoot = File("src/test/projects/configuration-cache-generated-sources") + + // check to avoid plugin regressions that might affect Gradle's configuration caching + // https://docs.gradle.org/current/userguide/configuration_cache.html + gradleRunner + .withArguments("testDebug", "--configuration-cache", "--stacktrace") + .runFixture(fixtureRoot) { build() } + } + @Test fun interceptViewEditMode() { val fixtureRoot = File("src/test/projects/edit-mode-intercept") diff --git a/paparazzi-gradle-plugin/src/test/projects/configuration-cache-generated-sources/build.gradle b/paparazzi-gradle-plugin/src/test/projects/configuration-cache-generated-sources/build.gradle new file mode 100644 index 0000000000..9de5b625f9 --- /dev/null +++ b/paparazzi-gradle-plugin/src/test/projects/configuration-cache-generated-sources/build.gradle @@ -0,0 +1,37 @@ +plugins { + id 'com.android.library' + id 'kotlin-android' + id 'app.cash.paparazzi' +} + +android { + namespace 'app.cash.paparazzi.plugin.test' + compileSdk libs.versions.compileSdk.get() as int + defaultConfig { + minSdk libs.versions.minSdk.get() as int + } + compileOptions { + sourceCompatibility = libs.versions.javaTarget.get() + targetCompatibility = libs.versions.javaTarget.get() + } + kotlinOptions { + jvmTarget = libs.versions.javaTarget.get() + } +} + +androidComponents { + onVariants(selector().all()) { variant -> + def sourceGen = project.tasks.register("do${variant.name.capitalize()}SourceGen", SourceGenTask) + variant.sources.res.addGeneratedSourceDirectory( + sourceGen, + { task -> task.outputDirectory } + ) + } +} + +abstract class SourceGenTask extends DefaultTask { + @OutputDirectory + abstract DirectoryProperty getOutputDirectory() +} + +apply from: '../guava-fix.gradle' diff --git a/paparazzi-gradle-plugin/src/test/projects/configuration-cache-generated-sources/src/test/java/app/cash/paparazzi/plugin/test/VerifyTest.kt b/paparazzi-gradle-plugin/src/test/projects/configuration-cache-generated-sources/src/test/java/app/cash/paparazzi/plugin/test/VerifyTest.kt new file mode 100644 index 0000000000..324f772be5 --- /dev/null +++ b/paparazzi-gradle-plugin/src/test/projects/configuration-cache-generated-sources/src/test/java/app/cash/paparazzi/plugin/test/VerifyTest.kt @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2020 Square, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package app.cash.paparazzi.plugin.test + +import app.cash.paparazzi.Paparazzi +import org.junit.Rule +import org.junit.Test + +class VerifyTest { + @get:Rule + val paparazzi = Paparazzi() + + @Test + fun verify() {} +}