cashapp / paparazzi

Render your Android screens without a physical device or emulator
https://cashapp.github.io/paparazzi/
Apache License 2.0
2.27k stars 213 forks source link

'other' has different root #956

Closed JavierSegoviaCordoba closed 1 year ago

JavierSegoviaCordoba commented 1 year ago

Description I am getting this crash when the task preparePaparazziDebugResources is executed on Windows OS

Caused by: java.lang.IllegalArgumentException: 'other' has different root
        at java.base/sun.nio.fs.WindowsPath.relativize(WindowsPath.java:404)
        at java.base/sun.nio.fs.WindowsPath.relativize(WindowsPath.java:42)
        at app.cash.paparazzi.gradle.utils.FileUtilsKt.relativize(FileUtils.kt:27)

Additional information:

JavierSegoviaCordoba commented 1 year ago

It is not happening with 1.2.0.

TWiStErRob commented 1 year ago

Based on git blame the method was added in https://github.com/cashapp/paparazzi/commit/61ceebf59b296acd00e163ad4f2a22e6ea5d3746 (#766) which is only in 1.3.0 tag.

jrodbx commented 1 year ago

'other' has different root

Hmmm, this looks similar to:

in that this implies that the receiver (of type Directory) and the argument (of type File) for app.cash.paparazzi.gradle.utils.FileUtilsKt.relativize are located on different drives (e.g., C:\, D:) on Windows fs.

TWiStErRob commented 1 year ago

relativeToOrNull or relativeToOrSelf might come in handy here.

TWiStErRob commented 1 year ago

From experience this can happen if the %GRADLE_USER_HOME% (or testkit in %TEMP%) are located on a different drives. e.g. I have all my code on P:, C: has system with Temp and have a separate SSD for (gradle) caches at Z:. @JavierSegoviaCordoba do you have something similar?

JavierSegoviaCordoba commented 1 year ago

Yeah, have the source code in a different drive, but I only have two disk, the main one, c and another one for the repos, d.

kevinzheng-ap commented 1 year ago

@JavierSegoviaCordoba Could you please provide full error logs? Need to know which line in PrepareResourcesTask actually throw the error.

JavierSegoviaCordoba commented 1 year ago

@kevinzheng-ap

Caused by: java.lang.IllegalArgumentException: 'other' has different root
        at app.cash.paparazzi.gradle.utils.FileUtilsKt.relativize(FileUtils.kt:27)
        at app.cash.paparazzi.gradle.utils.FileUtilsKt$joinFiles$1.invoke(FileUtils.kt:23)
        at app.cash.paparazzi.gradle.utils.FileUtilsKt$joinFiles$1.invoke(FileUtils.kt:22)
        at kotlin.text.StringsKt__AppendableKt.appendElement(Appendable.kt:85)
        at kotlin.collections.CollectionsKt___CollectionsKt.joinTo(_Collections.kt:3490)
        at kotlin.collections.CollectionsKt___CollectionsKt.joinToString(_Collections.kt:3507)
        at kotlin.collections.CollectionsKt___CollectionsKt.joinToString$default(_Collections.kt:3506)
        at app.cash.paparazzi.gradle.utils.FileUtilsKt.joinFiles(FileUtils.kt:22)
        at app.cash.paparazzi.gradle.PrepareResourcesTask.writeResourcesFile(PrepareResourcesTask.kt:106)
jrodbx commented 1 year ago

PrepareResourcesTask.kt:106 in 1.3.0 points to this line:

        it.write(libraryResourceDirs.joinFiles(gradleUserHomeDirectory))

gradleUserHomeDirectory is set by

private val gradleUserHomeDirectory = projectDirectory.dir(project.gradle.gradleUserHomeDir.path)

and should be something like D:\gradle\home (can you confirm?)

libraryResourceDirs should be a comma-delimited list of relative paths, i.e.,

caches/transforms-3/9857af1a3795364c8daa966d0860d308/transformed/material-ripple-1.4.3/res,caches/transforms-3/b21ccc548dd99a0e96dbdaf4d800916e/transformed/material-icons-core-1.4.3/res,caches/transforms-3/9781c94dff12e752cf590064e5344ac8/transformed/animation-core-1.4.3/res,caches/transforms-3/04a9ba9108c0c2e64f038cbad2028368/transformed/animation-1.4.3/res,...

(can you confirm by checking PROJECT_ROOT/build/intermediates/paparazzi/VARIANT/resources.txt?)

JavierSegoviaCordoba commented 1 year ago

This is the content of PROJECT_ROOT/build/intermediates/paparazzi/VARIANT/resources.txt:

com.javiersc.foo.bar
intermediates/merged_res/debug
33
platforms/android-33/
intermediates/assets/debug
com.javiersc.foo.bar,com.javiersc.shared.ui,coil.compose.singleton,org.koin.android,coil.compose.base,coil.singleton,com.google.accompanist.drawablepainter,androidx.compose.material3,androidx.compose.material.ripple,androidx.compose.material.icons,androidx.compose.material,androidx.compose.animation.core,androidx.compose.animation,androidx.compose.foundation.layout,androidx.compose.foundation,androidx.compose.ui.tooling.data,androidx.compose.ui.util,androidx.compose.ui.unit,androidx.compose.ui.text,androidx.compose.ui.geometry,androidx.compose.ui.tooling.preview,androidx.compose.ui.test.manifest,androidx.compose.ui.graphics,androidx.compose.ui.tooling,androidx.fragment.ktx,coil.base,androidx.appcompat.resources,androidx.appcompat,androidx.fragment,androidx.activity,androidx.activity.ktx,androidx.activity.compose,androidx.compose.ui,androidx.customview.poolingcontainer,androidx.palette,androidx.legacy.coreutils,androidx.loader,androidx.emoji2.viewsintegration,androidx.emoji2,androidx.lifecycle.process,androidx.lifecycle.livedata.core,androidx.lifecycle.livedata,androidx.lifecycle.livedata.core.ktx,androidx.lifecycle.viewmodel.ktx,androidx.lifecycle.viewmodel,androidx.savedstate.ktx,androidx.savedstate,androidx.lifecycle.viewmodel.savedstate,androidx.core.ktx,androidx.autofill,androidx.drawerlayout,androidx.vectordrawable.animated,androidx.vectordrawable,androidx.viewpager,androidx.customview,androidx.core,androidx.lifecycle.runtime,androidx.lifecycle.ktx,androidx.compose.runtime.saveable,androidx.compose.runtime,com.javiersc.kotlin.stdlib,androidx.annotation.experimental,androidx.interpolator,androidx.versionedparcelable,androidx.arch.core,androidx.documentfile,androidx.localbroadcastmanager,androidx.print,androidx.cursoradapter,androidx.profileinstaller,androidx.startup,androidx.tracing,androidx.exifinterface
src/main/res,src/debug/res
jrodbx commented 1 year ago

Ok, so this means you have no transitive dependencies which contain resource folders, so I would expect the fileCollection to be empty? 🤔

Mind stepping through a debugger on a Windows machine and seeing why FileUtils is throwing that exception? I don't have a Windows install handy.

jrodbx commented 1 year ago

Also, can you try 1.3.1-SNAPSHOT and see if this is fixed? My attempts to repro on CI aren't failing with a stacktrace similar to what you provided.

TWiStErRob commented 1 year ago

Ok, so this means you have no transitive dependencies which contain resource folders, so I would expect the fileCollection to be empty? 🤔

@jrodbx I think that's this one: #998

TWiStErRob commented 1 year ago

can you confirm by checking PROJECT_ROOT/build/intermediates/paparazzi/VARIANT/resources.txt?

Wait, @jrodbx, this file is written by PrepareResourcesTask, which is failing, so we're not observing the full contents here, so:

mainPackage=com.javiersc.foo.bar
mergeResourcsOutputDir=intermediates/merged_res/debug
targetSdkVersion=33
compileSdk=platforms/android-33/
mergeAssetsOutputDir=intermediates/assets/debug
resourcePackageNames=com.javiersc.foo.bar,com.javiersc.shared.ui,coil.compose.singleton,org.koin.android,coil.compose.base,coil.singleton,com.google.accompanist.drawablepainter,androidx.compose.material3,androidx.compose.material.ripple,androidx.compose.material.icons,androidx.compose.material,androidx.compose.animation.core,androidx.compose.animation,androidx.compose.foundation.layout,androidx.compose.foundation,androidx.compose.ui.tooling.data,androidx.compose.ui.util,androidx.compose.ui.unit,androidx.compose.ui.text,androidx.compose.ui.geometry,androidx.compose.ui.tooling.preview,androidx.compose.ui.test.manifest,androidx.compose.ui.graphics,androidx.compose.ui.tooling,androidx.fragment.ktx,coil.base,androidx.appcompat.resources,androidx.appcompat,androidx.fragment,androidx.activity,androidx.activity.ktx,androidx.activity.compose,androidx.compose.ui,androidx.customview.poolingcontainer,androidx.palette,androidx.legacy.coreutils,androidx.loader,androidx.emoji2.viewsintegration,androidx.emoji2,androidx.lifecycle.process,androidx.lifecycle.livedata.core,androidx.lifecycle.livedata,androidx.lifecycle.livedata.core.ktx,androidx.lifecycle.viewmodel.ktx,androidx.lifecycle.viewmodel,androidx.savedstate.ktx,androidx.savedstate,androidx.lifecycle.viewmodel.savedstate,androidx.core.ktx,androidx.autofill,androidx.drawerlayout,androidx.vectordrawable.animated,androidx.vectordrawable,androidx.viewpager,androidx.customview,androidx.core,androidx.lifecycle.runtime,androidx.lifecycle.ktx,androidx.compose.runtime.saveable,androidx.compose.runtime,com.javiersc.kotlin.stdlib,androidx.annotation.experimental,androidx.interpolator,androidx.versionedparcelable,androidx.arch.core,androidx.documentfile,androidx.localbroadcastmanager,androidx.print,androidx.cursoradapter,androidx.profileinstaller,androidx.startup,androidx.tracing,androidx.exifinterface
localResourceDirs=src/main/res,src/debug/res
libraryResourceDirs=<empty because exception thrown while calculating value, so .use { } closed the file early>

I tried to repro on 1.3.0 branch

by relocating GRADLE_USER_HOME for the test ```cmd rem Remember, 1.3.0 is on the old project structure mkdir paparazzi\paparazzi-gradle-plugin\build\tmp\test\work subst D: paparazzi\paparazzi-gradle-plugin\build\tmp\test\work ``` ```patch Index: paparazzi/paparazzi-gradle-plugin/build.gradle IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/paparazzi/paparazzi-gradle-plugin/build.gradle b/paparazzi/paparazzi-gradle-plugin/build.gradle --- a/paparazzi/paparazzi-gradle-plugin/build.gradle (revision 43debed260aed91a09a8880d146f6c3a9e4bfc0d) +++ b/paparazzi/paparazzi-gradle-plugin/build.gradle (date 1689422574907) @@ -39,6 +39,7 @@ tasks.withType(Test).configureEach { dependsOn(':paparazzi:publishMavenPublicationToProjectLocalMavenRepository') dependsOn(':paparazzi-agent:publishMavenPublicationToProjectLocalMavenRepository') + systemProperty("org.gradle.testkit.dir", "D:\\.gradle-test-kit") } // When cleaning this project, we also want to clean the test projects. ```
and dumping out diagnostics ```patch Index: paparazzi/paparazzi/src/main/java/app/cash/paparazzi/Environment.kt IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/paparazzi/paparazzi/src/main/java/app/cash/paparazzi/Environment.kt b/paparazzi/paparazzi/src/main/java/app/cash/paparazzi/Environment.kt --- a/paparazzi/paparazzi/src/main/java/app/cash/paparazzi/Environment.kt (revision 43debed260aed91a09a8880d146f6c3a9e4bfc0d) +++ b/paparazzi/paparazzi/src/main/java/app/cash/paparazzi/Environment.kt (date 1689423948634) @@ -54,10 +54,22 @@ val resourcesFile = File(System.getProperty("paparazzi.test.resources")) val configLines = resourcesFile.readLines() + println(configLines) + configLines.forEachIndexed { index, configLine -> + println("configLines[$index]=$configLine") + } val appTestDir = Paths.get(System.getProperty("paparazzi.build.dir")) val artifactsCacheDir = Paths.get(System.getProperty("paparazzi.artifacts.cache.dir")) val androidHome = Paths.get(androidHome()) + println( + """ + appTestDir: $appTestDir + artifactsCacheDir: $artifactsCacheDir + androidHome: $androidHome + """.trimIndent() + ) + return Environment( platformDir = androidHome.resolve(configLines[3]).toString(), appTestDir = appTestDir.toString(), @@ -69,6 +81,7 @@ localResourceDirs = configLines[6].split(","), libraryResourceDirs = configLines[7].split(",").map { artifactsCacheDir.resolve(it).toString() } ) + .also { println(it) } } private fun androidSdkPath(): String { ```

then I ran:

gradlew -p paparazzi -x :paparazzi:dokkaHtml :paparazzi-gradle-plugin:cleanTest :paparazzi-gradle-plugin:test --no-build-cache --tests app.cash.paparazzi.gradle.PaparazziPluginTest
.composeA11y

and checked the build log of the test:

file:///P:/projects/contrib/github-paparazzi/paparazzi/paparazzi-gradle-plugin/src/test/projects/compose-a11y/build/reports/tests/testDebugUnitTest/classes/app.cash.paparazzi.plugin.test.ComposeA11yTest.html

and I got this output:

[app.cash.paparazzi.plugin.test, intermediates/merged_res/debug, 33, platforms/android-33/, intermediates/assets/debug, app.cash.paparazzi.plugin.test,androidx.compose.material.ripple,androidx.compose.material.icons,androidx.compose.material,androidx.compose.foundation.layout,androidx.compose.animation.core,androidx.compose.ui.util,androidx.compose.ui.unit,androidx.compose.ui.text,androidx.compose.ui.graphics,androidx.compose.ui.geometry,androidx.compose.ui,androidx.compose.foundation,androidx.compose.animation,androidx.compose.runtime.saveable,androidx.compose.runtime,androidx.appcompat.resources,androidx.appcompat,androidx.fragment,androidx.emoji2.viewsintegration,androidx.emoji2,androidx.loader,androidx.activity,androidx.activity.ktx,androidx.lifecycle.viewmodel.ktx,androidx.lifecycle.ktx,androidx.lifecycle.livedata,androidx.lifecycle.process,androidx.lifecycle.livedata.core,androidx.lifecycle.viewmodel.savedstate,androidx.lifecycle.viewmodel,androidx.drawerlayout,androidx.vectordrawable.animated,androidx.vectordrawable,androidx.customview.poolingcontainer,androidx.core.ktx,androidx.viewpager,androidx.customview,androidx.autofill,androidx.core,androidx.lifecycle.runtime,androidx.savedstate.ktx,androidx.savedstate,androidx.annotation.experimental,androidx.cursoradapter,androidx.arch.core,androidx.profileinstaller,androidx.startup,androidx.tracing,androidx.versionedparcelable,androidx.interpolator, src/main/res,src/debug/res, caches/transforms-3/a157f0f77b0efdb2fda56a8398c64367/transformed/material-ripple-1.4.3/res,caches/transforms-3/2e52a2b2b1b7ca5a6f2bd7bd07a8c5b2/transformed/material-icons-core-1.4.3/res,caches/transforms-3/e589a6f222601a1892f34d13e76a511c/transformed/material-1.4.3/res,caches/transforms-3/b8410ce940f3203cdb80c56b6fe6620d/transformed/foundation-layout-1.4.3/res,caches/transforms-3/2b74692f3c96608261409ce785f1b769/transformed/animation-core-1.2.1/res,caches/transforms-3/bed197ff0573b4223bb22da1c82f7d24/transformed/ui-util-1.4.3/res,caches/transforms-3/7c217f5b1a5cb18afd8f1ab28d243df4/transformed/ui-unit-1.4.3/res,caches/transforms-3/4b1543363b8ce3e1a4805b389f555d4b/transformed/ui-text-1.4.3/res,caches/transforms-3/dc5563c45ec97fc0212fc1c04fa1c9c4/transformed/ui-graphics-1.4.3/res,caches/transforms-3/dfddf6f0e0f90b3de1b4a29454d4ebda/transformed/ui-geometry-1.4.3/res,caches/transforms-3/cc1d84fe0cac3c427c08b5f03a977f3a/transformed/ui-1.4.3/res,caches/transforms-3/5765532996f742031e40595283afe16e/transformed/foundation-1.4.3/res,caches/transforms-3/7d7207e124f4bbe20b0f8e9947039aac/transformed/animation-1.2.1/res,caches/transforms-3/592d1fe9b7fb5a53e78b95359a8acf3c/transformed/runtime-saveable-1.4.3/res,caches/transforms-3/fc894f421dd05f888dfc28959a627f28/transformed/runtime-1.4.3/res,caches/transforms-3/b65ec37bbc97251e8d685338e24e8565/transformed/appcompat-resources-1.6.1/res,caches/transforms-3/3426e56317d982307c7f1bd541c1bb3b/transformed/appcompat-1.6.1/res,caches/transforms-3/6b4747d44aed9cc32b5b9f969d2b3bb9/transformed/fragment-1.3.6/res,caches/transforms-3/46722104e293d68b45dc1a314b5dd6cf/transformed/emoji2-views-helper-1.3.0/res,caches/transforms-3/36b0e4f6b84b3fca539557e4b7645d21/transformed/emoji2-1.3.0/res,caches/transforms-3/d1c7210f5bc8d5d820472eec9a692bd2/transformed/activity-1.7.0/res,caches/transforms-3/632c1abdd2bf129375d876d8fa6360d9/transformed/activity-ktx-1.7.0/res,caches/transforms-3/0ecb5be150d2dedd58f9cb8a45bca851/transformed/lifecycle-viewmodel-ktx-2.6.1/res,caches/transforms-3/2d5fa5034c7492393bc9e868276420a1/transformed/lifecycle-runtime-ktx-2.6.1/res,caches/transforms-3/c8b99e4b4dfd4fb092fc0943d2db64e3/transformed/lifecycle-livedata-2.6.1/res,caches/transforms-3/bf79fd5f3d67cdc25e08fa327a30cefa/transformed/lifecycle-process-2.6.1/res,caches/transforms-3/ad643e17ec9b808a70b34949daaa85dd/transformed/lifecycle-livedata-core-2.6.1/res,caches/transforms-3/700829b6034d6e55d18823d22fb7719e/transformed/lifecycle-viewmodel-savedstate-2.6.1/res,caches/transforms-3/39a9c4c54782ba97ca0a16178536bc44/transformed/lifecycle-viewmodel-2.6.1/res,caches/transforms-3/f30ae580f25dade5b9a048c623bbe384/transformed/customview-poolingcontainer-1.0.0/res,caches/transforms-3/17d0263f7ff79ac2813c39c8013711c0/transformed/core-ktx-1.9.0/res,caches/transforms-3/84d9c409aee55eaefce67c266389856d/transformed/core-1.9.0/res,caches/transforms-3/2046526c99e51e283490cf9ec8865459/transformed/lifecycle-runtime-2.6.1/res,caches/transforms-3/c67e265009f821358c6f41b8659188ed/transformed/savedstate-ktx-1.2.1/res,caches/transforms-3/b86250ed7d137bbef1a6ee11b2c89ceb/transformed/savedstate-1.2.1/res,caches/transforms-3/53626b0bfa72d466bd6680f40d581ce3/transformed/annotation-experimental-1.3.0/res,caches/transforms-3/398d5bcb70720fdd51c416ec80f3d907/transformed/core-runtime-2.2.0/res,caches/transforms-3/f36d6c4c9c9b27a2aab75d7392d90252/transformed/profileinstaller-1.3.0/res,caches/transforms-3/7b61d2349bdea8daf44d8ea280f29f66/transformed/startup-runtime-1.1.1/res]
configLines[0]=app.cash.paparazzi.plugin.test
configLines[1]=intermediates/merged_res/debug
configLines[2]=33
configLines[3]=platforms/android-33/
configLines[4]=intermediates/assets/debug
configLines[5]=app.cash.paparazzi.plugin.test,androidx.compose.material.ripple,androidx.compose.material.icons,androidx.compose.material,androidx.compose.foundation.layout,androidx.compose.animation.core,androidx.compose.ui.util,androidx.compose.ui.unit,androidx.compose.ui.text,androidx.compose.ui.graphics,androidx.compose.ui.geometry,androidx.compose.ui,androidx.compose.foundation,androidx.compose.animation,androidx.compose.runtime.saveable,androidx.compose.runtime,androidx.appcompat.resources,androidx.appcompat,androidx.fragment,androidx.emoji2.viewsintegration,androidx.emoji2,androidx.loader,androidx.activity,androidx.activity.ktx,androidx.lifecycle.viewmodel.ktx,androidx.lifecycle.ktx,androidx.lifecycle.livedata,androidx.lifecycle.process,androidx.lifecycle.livedata.core,androidx.lifecycle.viewmodel.savedstate,androidx.lifecycle.viewmodel,androidx.drawerlayout,androidx.vectordrawable.animated,androidx.vectordrawable,androidx.customview.poolingcontainer,androidx.core.ktx,androidx.viewpager,androidx.customview,androidx.autofill,androidx.core,androidx.lifecycle.runtime,androidx.savedstate.ktx,androidx.savedstate,androidx.annotation.experimental,androidx.cursoradapter,androidx.arch.core,androidx.profileinstaller,androidx.startup,androidx.tracing,androidx.versionedparcelable,androidx.interpolator
configLines[6]=src/main/res,src/debug/res
configLines[7]=caches/transforms-3/a157f0f77b0efdb2fda56a8398c64367/transformed/material-ripple-1.4.3/res,caches/transforms-3/2e52a2b2b1b7ca5a6f2bd7bd07a8c5b2/transformed/material-icons-core-1.4.3/res,caches/transforms-3/e589a6f222601a1892f34d13e76a511c/transformed/material-1.4.3/res,caches/transforms-3/b8410ce940f3203cdb80c56b6fe6620d/transformed/foundation-layout-1.4.3/res,caches/transforms-3/2b74692f3c96608261409ce785f1b769/transformed/animation-core-1.2.1/res,caches/transforms-3/bed197ff0573b4223bb22da1c82f7d24/transformed/ui-util-1.4.3/res,caches/transforms-3/7c217f5b1a5cb18afd8f1ab28d243df4/transformed/ui-unit-1.4.3/res,caches/transforms-3/4b1543363b8ce3e1a4805b389f555d4b/transformed/ui-text-1.4.3/res,caches/transforms-3/dc5563c45ec97fc0212fc1c04fa1c9c4/transformed/ui-graphics-1.4.3/res,caches/transforms-3/dfddf6f0e0f90b3de1b4a29454d4ebda/transformed/ui-geometry-1.4.3/res,caches/transforms-3/cc1d84fe0cac3c427c08b5f03a977f3a/transformed/ui-1.4.3/res,caches/transforms-3/5765532996f742031e40595283afe16e/transformed/foundation-1.4.3/res,caches/transforms-3/7d7207e124f4bbe20b0f8e9947039aac/transformed/animation-1.2.1/res,caches/transforms-3/592d1fe9b7fb5a53e78b95359a8acf3c/transformed/runtime-saveable-1.4.3/res,caches/transforms-3/fc894f421dd05f888dfc28959a627f28/transformed/runtime-1.4.3/res,caches/transforms-3/b65ec37bbc97251e8d685338e24e8565/transformed/appcompat-resources-1.6.1/res,caches/transforms-3/3426e56317d982307c7f1bd541c1bb3b/transformed/appcompat-1.6.1/res,caches/transforms-3/6b4747d44aed9cc32b5b9f969d2b3bb9/transformed/fragment-1.3.6/res,caches/transforms-3/46722104e293d68b45dc1a314b5dd6cf/transformed/emoji2-views-helper-1.3.0/res,caches/transforms-3/36b0e4f6b84b3fca539557e4b7645d21/transformed/emoji2-1.3.0/res,caches/transforms-3/d1c7210f5bc8d5d820472eec9a692bd2/transformed/activity-1.7.0/res,caches/transforms-3/632c1abdd2bf129375d876d8fa6360d9/transformed/activity-ktx-1.7.0/res,caches/transforms-3/0ecb5be150d2dedd58f9cb8a45bca851/transformed/lifecycle-viewmodel-ktx-2.6.1/res,caches/transforms-3/2d5fa5034c7492393bc9e868276420a1/transformed/lifecycle-runtime-ktx-2.6.1/res,caches/transforms-3/c8b99e4b4dfd4fb092fc0943d2db64e3/transformed/lifecycle-livedata-2.6.1/res,caches/transforms-3/bf79fd5f3d67cdc25e08fa327a30cefa/transformed/lifecycle-process-2.6.1/res,caches/transforms-3/ad643e17ec9b808a70b34949daaa85dd/transformed/lifecycle-livedata-core-2.6.1/res,caches/transforms-3/700829b6034d6e55d18823d22fb7719e/transformed/lifecycle-viewmodel-savedstate-2.6.1/res,caches/transforms-3/39a9c4c54782ba97ca0a16178536bc44/transformed/lifecycle-viewmodel-2.6.1/res,caches/transforms-3/f30ae580f25dade5b9a048c623bbe384/transformed/customview-poolingcontainer-1.0.0/res,caches/transforms-3/17d0263f7ff79ac2813c39c8013711c0/transformed/core-ktx-1.9.0/res,caches/transforms-3/84d9c409aee55eaefce67c266389856d/transformed/core-1.9.0/res,caches/transforms-3/2046526c99e51e283490cf9ec8865459/transformed/lifecycle-runtime-2.6.1/res,caches/transforms-3/c67e265009f821358c6f41b8659188ed/transformed/savedstate-ktx-1.2.1/res,caches/transforms-3/b86250ed7d137bbef1a6ee11b2c89ceb/transformed/savedstate-1.2.1/res,caches/transforms-3/53626b0bfa72d466bd6680f40d581ce3/transformed/annotation-experimental-1.3.0/res,caches/transforms-3/398d5bcb70720fdd51c416ec80f3d907/transformed/core-runtime-2.2.0/res,caches/transforms-3/f36d6c4c9c9b27a2aab75d7392d90252/transformed/profileinstaller-1.3.0/res,caches/transforms-3/7b61d2349bdea8daf44d8ea280f29f66/transformed/startup-runtime-1.1.1/res
appTestDir: P:\projects\contrib\github-paparazzi\paparazzi\paparazzi-gradle-plugin\src\test\projects\compose-a11y\build
artifactsCacheDir: D:\.gradle-test-kit
androidHome: Z:\tools\sdk\android
Environment(platformDir=Z:\tools\sdk\android\platforms\android-33, appTestDir=P:\projects\contrib\github-paparazzi\paparazzi\paparazzi-gradle-plugin\src\test\projects\compose-a11y\build, resDir=P:\projects\contrib\github-paparazzi\paparazzi\paparazzi-gradle-plugin\src\test\projects\compose-a11y\build\intermediates\merged_res\debug, assetsDir=P:\projects\contrib\github-paparazzi\paparazzi\paparazzi-gradle-plugin\src\test\projects\compose-a11y\build\intermediates\assets\debug, packageName=app.cash.paparazzi.plugin.test, compileSdkVersion=33, resourcePackageNames=[app.cash.paparazzi.plugin.test, androidx.compose.material.ripple, androidx.compose.material.icons, androidx.compose.material, androidx.compose.foundation.layout, androidx.compose.animation.core, androidx.compose.ui.util, androidx.compose.ui.unit, androidx.compose.ui.text, androidx.compose.ui.graphics, androidx.compose.ui.geometry, androidx.compose.ui, androidx.compose.foundation, androidx.compose.animation, androidx.compose.runtime.saveable, androidx.compose.runtime, androidx.appcompat.resources, androidx.appcompat, androidx.fragment, androidx.emoji2.viewsintegration, androidx.emoji2, androidx.loader, androidx.activity, androidx.activity.ktx, androidx.lifecycle.viewmodel.ktx, androidx.lifecycle.ktx, androidx.lifecycle.livedata, androidx.lifecycle.process, androidx.lifecycle.livedata.core, androidx.lifecycle.viewmodel.savedstate, androidx.lifecycle.viewmodel, androidx.drawerlayout, androidx.vectordrawable.animated, androidx.vectordrawable, androidx.customview.poolingcontainer, androidx.core.ktx, androidx.viewpager, androidx.customview, androidx.autofill, androidx.core, androidx.lifecycle.runtime, androidx.savedstate.ktx, androidx.savedstate, androidx.annotation.experimental, androidx.cursoradapter, androidx.arch.core, androidx.profileinstaller, androidx.startup, androidx.tracing, androidx.versionedparcelable, androidx.interpolator], localResourceDirs=[src/main/res, src/debug/res], libraryResourceDirs=[D:\.gradle-test-kit\caches\transforms-3\a157f0f77b0efdb2fda56a8398c64367\transformed\material-ripple-1.4.3\res, D:\.gradle-test-kit\caches\transforms-3\2e52a2b2b1b7ca5a6f2bd7bd07a8c5b2\transformed\material-icons-core-1.4.3\res, D:\.gradle-test-kit\caches\transforms-3\e589a6f222601a1892f34d13e76a511c\transformed\material-1.4.3\res, D:\.gradle-test-kit\caches\transforms-3\b8410ce940f3203cdb80c56b6fe6620d\transformed\foundation-layout-1.4.3\res, D:\.gradle-test-kit\caches\transforms-3\2b74692f3c96608261409ce785f1b769\transformed\animation-core-1.2.1\res, D:\.gradle-test-kit\caches\transforms-3\bed197ff0573b4223bb22da1c82f7d24\transformed\ui-util-1.4.3\res, D:\.gradle-test-kit\caches\transforms-3\7c217f5b1a5cb18afd8f1ab28d243df4\transformed\ui-unit-1.4.3\res, D:\.gradle-test-kit\caches\transforms-3\4b1543363b8ce3e1a4805b389f555d4b\transformed\ui-text-1.4.3\res, D:\.gradle-test-kit\caches\transforms-3\dc5563c45ec97fc0212fc1c04fa1c9c4\transformed\ui-graphics-1.4.3\res, D:\.gradle-test-kit\caches\transforms-3\dfddf6f0e0f90b3de1b4a29454d4ebda\transformed\ui-geometry-1.4.3\res, D:\.gradle-test-kit\caches\transforms-3\cc1d84fe0cac3c427c08b5f03a977f3a\transformed\ui-1.4.3\res, D:\.gradle-test-kit\caches\transforms-3\5765532996f742031e40595283afe16e\transformed\foundation-1.4.3\res, D:\.gradle-test-kit\caches\transforms-3\7d7207e124f4bbe20b0f8e9947039aac\transformed\animation-1.2.1\res, D:\.gradle-test-kit\caches\transforms-3\592d1fe9b7fb5a53e78b95359a8acf3c\transformed\runtime-saveable-1.4.3\res, D:\.gradle-test-kit\caches\transforms-3\fc894f421dd05f888dfc28959a627f28\transformed\runtime-1.4.3\res, D:\.gradle-test-kit\caches\transforms-3\b65ec37bbc97251e8d685338e24e8565\transformed\appcompat-resources-1.6.1\res, D:\.gradle-test-kit\caches\transforms-3\3426e56317d982307c7f1bd541c1bb3b\transformed\appcompat-1.6.1\res, D:\.gradle-test-kit\caches\transforms-3\6b4747d44aed9cc32b5b9f969d2b3bb9\transformed\fragment-1.3.6\res, D:\.gradle-test-kit\caches\transforms-3\46722104e293d68b45dc1a314b5dd6cf\transformed\emoji2-views-helper-1.3.0\res, D:\.gradle-test-kit\caches\transforms-3\36b0e4f6b84b3fca539557e4b7645d21\transformed\emoji2-1.3.0\res, D:\.gradle-test-kit\caches\transforms-3\d1c7210f5bc8d5d820472eec9a692bd2\transformed\activity-1.7.0\res, D:\.gradle-test-kit\caches\transforms-3\632c1abdd2bf129375d876d8fa6360d9\transformed\activity-ktx-1.7.0\res, D:\.gradle-test-kit\caches\transforms-3\0ecb5be150d2dedd58f9cb8a45bca851\transformed\lifecycle-viewmodel-ktx-2.6.1\res, D:\.gradle-test-kit\caches\transforms-3\2d5fa5034c7492393bc9e868276420a1\transformed\lifecycle-runtime-ktx-2.6.1\res, D:\.gradle-test-kit\caches\transforms-3\c8b99e4b4dfd4fb092fc0943d2db64e3\transformed\lifecycle-livedata-2.6.1\res, D:\.gradle-test-kit\caches\transforms-3\bf79fd5f3d67cdc25e08fa327a30cefa\transformed\lifecycle-process-2.6.1\res, D:\.gradle-test-kit\caches\transforms-3\ad643e17ec9b808a70b34949daaa85dd\transformed\lifecycle-livedata-core-2.6.1\res, D:\.gradle-test-kit\caches\transforms-3\700829b6034d6e55d18823d22fb7719e\transformed\lifecycle-viewmodel-savedstate-2.6.1\res, D:\.gradle-test-kit\caches\transforms-3\39a9c4c54782ba97ca0a16178536bc44\transformed\lifecycle-viewmodel-2.6.1\res, D:\.gradle-test-kit\caches\transforms-3\f30ae580f25dade5b9a048c623bbe384\transformed\customview-poolingcontainer-1.0.0\res, D:\.gradle-test-kit\caches\transforms-3\17d0263f7ff79ac2813c39c8013711c0\transformed\core-ktx-1.9.0\res, D:\.gradle-test-kit\caches\transforms-3\84d9c409aee55eaefce67c266389856d\transformed\core-1.9.0\res, D:\.gradle-test-kit\caches\transforms-3\2046526c99e51e283490cf9ec8865459\transformed\lifecycle-runtime-2.6.1\res, D:\.gradle-test-kit\caches\transforms-3\c67e265009f821358c6f41b8659188ed\transformed\savedstate-ktx-1.2.1\res, D:\.gradle-test-kit\caches\transforms-3\b86250ed7d137bbef1a6ee11b2c89ceb\transformed\savedstate-1.2.1\res, D:\.gradle-test-kit\caches\transforms-3\53626b0bfa72d466bd6680f40d581ce3\transformed\annotation-experimental-1.3.0\res, D:\.gradle-test-kit\caches\transforms-3\398d5bcb70720fdd51c416ec80f3d907\transformed\core-runtime-2.2.0\res, D:\.gradle-test-kit\caches\transforms-3\f36d6c4c9c9b27a2aab75d7392d90252\transformed\profileinstaller-1.3.0\res, D:\.gradle-test-kit\caches\transforms-3\7b61d2349bdea8daf44d8ea280f29f66\transformed\startup-runtime-1.1.1\res])

to me this means that it's not just the GRADLE_USER_HOME (testkitdir) being relocated, the assumption that all the exploded res are in that folder is failing in some way.

TWiStErRob commented 1 year ago

@jrodbx while writing steps @JavierSegoviaCordoba how to debug this, I managed to reproduce it!

Guide to debug In your synced project: ![image](https://github.com/cashapp/paparazzi/assets/2906988/fdfd1ef3-cc88-44df-825e-a92250ba21ef) then put a breakpoint on line 106. ``` gradlew --stop gradlew --no-daemon :the:project:that:fails:clean :the:project:thatfails:preparePaparazziDebugResources --no-build-cache -Dorg.gradle.debug=true ``` this should start: ``` > Starting Daemon [and nothing else happens, just a blinking cursor maybe] ``` you need to add a run configuration to Debug Gradle: ![image](https://github.com/cashapp/paparazzi/assets/2906988/b509ea0e-f0d7-422d-b40e-a2099e1a75fb) the defaults should work. Click OK, and press the Debug button on the toolbar: ![image](https://github.com/cashapp/paparazzi/assets/2906988/904eda3e-2ffb-429b-828f-8bd1ecba7ad1) this should say: ``` Connected to the target VM, address: 'localhost:5005', transport: 'socket' ``` and then the build starts running Then it should hit the breakpoint (eventually in a few seconds), then in the Evaluate dialog we need the value of `libraryResourceDirs.files`: ![image](https://github.com/cashapp/paparazzi/assets/2906988/c6563717-03a5-4770-9615-0ce2ccb0e491) and there's our answer!

Based on the last step above, we can have non-transformed exploded AARs from other modules: image

Which means we can't relativize everything in libraryResourceDirs against gradleUserHomeDirectory.

TWiStErRob commented 1 year ago

can you try 1.3.1-SNAPSHOT and see if this is fixed?

It does not reproduce with 1.3.1-SNAPSHOT from

maven("https://oss.sonatype.org/content/repositories/snapshots/")

because libraryResourceDirs got split up in #930 and #942

it.write(moduleResourceDirs.joinFiles(projectDirectory)) // contains packaged_res folders
it.write(aarExplodedDirs.joinFiles(gradleUserHomeDirectory)) // contains transforms-3 folders
TWiStErRob commented 1 year ago

@jrodbx I was curious why #792 (part of 1.3.0) wasn't exhibiting this, and it's probably because there's no submodules in CI. I wonder if it would worth applying something like this:

// :paparazz-gradle-plugin
tasks.withType(Test).configureEach {
  dependsOn(':paparazzi:publishMavenPublicationToProjectLocalMavenRepository')
  dependsOn(':paparazzi-agent:publishMavenPublicationToProjectLocalMavenRepository')
  if (isCI) {
    systemProperty("org.gradle.testkit.dir", new File(System.getProperty("java.io.tmpdir"), ".gradle-test-kit-paparazzi"))
  }
}

with the assumption that java.io.tmpdir will be at C:\Users\runner\...\Temp, therefore forcing project (D:\a\repo\repo) and "GRADLE_USER_HOME" be on separate drives (roots) for tests too, not just the project build.

jrodbx commented 1 year ago

can you try 1.3.1-SNAPSHOT and see if this is fixed?

It does not reproduce with 1.3.1-SNAPSHOT..

Awesome, closing as fixed.

@jrodbx I was curious why https://github.com/cashapp/paparazzi/pull/792 (part of 1.3.0) wasn't exhibiting this

Because test projects hadn't been using external aars with resources in them, but that's since been fixed.