in hot-reload-gradle-plugin/src/main/kotlin/org/jetbrains/compose/reload/gradle/runtimeClasspath.kt [114:170]
fun sync() {
val destination = destinationDir.asFile.get().toPath()
if (destination.exists()) destination.deleteRecursively()
destination.createDirectories()
artifactCollection.get().flatten().forEach { artifact ->
val crc = CRC32()
artifact.variant.capabilities.forEach { capability ->
crc.update(capability.name.encodeToByteArray())
crc.update(capability.group.encodeToByteArray())
crc.update(capability.version?.encodeToByteArray() ?: byteArrayOf())
}
artifact.variant.attributes.keySet().forEach { key ->
crc.update(key.name.encodeToByteArray())
crc.update(artifact.variant.attributes.getAttribute(key).toString().encodeToByteArray())
}
if (artifact.id.componentIdentifier is OpaqueComponentArtifactIdentifier) {
crc.update(artifact.file.absolutePath.encodeToByteArray())
}
val disambiguationHash = crc.value.toInt().toString(24)
val componentIdentifier = artifact.id.componentIdentifier
val targetFile = when (componentIdentifier) {
is ModuleComponentIdentifier -> destination.resolve(
"${componentIdentifier.group.asFileName()}/" +
"${componentIdentifier.module.asFileName()}/" +
"${componentIdentifier.version.asFileName()}/" +
"${disambiguationHash}/" +
"${artifact.file.nameWithoutExtension}.${artifact.file.extension}"
)
is ProjectComponentIdentifier -> destination.resolve(
@Suppress("UnstableApiUsage")
componentIdentifier.buildTreePath.removePrefix(":").replace(":", "/").asFileName()
).resolve(disambiguationHash).resolve(artifact.file.name)
else -> destination.resolve("opaque").resolve(disambiguationHash).resolve(artifact.file.name)
}
if (artifact.file.exists()) {
targetFile.createParentDirectories()
}
if (artifact.file.isFile) {
artifact.file.copyTo(targetFile.toFile(), overwrite = true)
}
if (artifact.file.isDirectory) {
val targetFileJar = targetFile.resolveSibling("${targetFile.name}.jar")
artifact.file.toPath().copyRecursivelyToZip(targetFileJar, false)
}
}
}