fun sync()

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)
            }
        }
    }