Improve hashing of script files
This commit is contained in:
committed by
Ilya Chernikov
parent
890da492fb
commit
8f80cf5664
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.mainKts
|
|||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import org.jetbrains.kotlin.mainKts.impl.IvyResolver
|
import org.jetbrains.kotlin.mainKts.impl.IvyResolver
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.nio.ByteBuffer
|
||||||
import java.security.MessageDigest
|
import java.security.MessageDigest
|
||||||
import kotlin.script.dependencies.ScriptContents
|
import kotlin.script.dependencies.ScriptContents
|
||||||
import kotlin.script.dependencies.ScriptDependenciesResolver
|
import kotlin.script.dependencies.ScriptDependenciesResolver
|
||||||
@@ -36,6 +37,7 @@ abstract class MainKtsScript(val args: Array<String>)
|
|||||||
|
|
||||||
const val COMPILED_SCRIPTS_CACHE_DIR_ENV_VAR = "KOTLIN_MAIN_KTS_COMPILED_SCRIPTS_CACHE_DIR"
|
const val COMPILED_SCRIPTS_CACHE_DIR_ENV_VAR = "KOTLIN_MAIN_KTS_COMPILED_SCRIPTS_CACHE_DIR"
|
||||||
const val COMPILED_SCRIPTS_CACHE_DIR_PROPERTY = "kotlin.main.kts.compiled.scripts.cache.dir"
|
const val COMPILED_SCRIPTS_CACHE_DIR_PROPERTY = "kotlin.main.kts.compiled.scripts.cache.dir"
|
||||||
|
const val COMPILED_SCRIPTS_CACHE_VERSION = 1
|
||||||
|
|
||||||
class MainKtsScriptDefinition : ScriptCompilationConfiguration(
|
class MainKtsScriptDefinition : ScriptCompilationConfiguration(
|
||||||
{
|
{
|
||||||
@@ -149,15 +151,25 @@ class MainKtsConfigurator : RefineScriptCompilationConfigurationHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun compiledScriptUniqueName(script: SourceCode, scriptCompilationConfiguration: ScriptCompilationConfiguration): String {
|
private fun compiledScriptUniqueName(script: SourceCode, scriptCompilationConfiguration: ScriptCompilationConfiguration): String {
|
||||||
val digestWrapper = MessageDigest.getInstance("MD5")
|
val digestWrapper = MessageDigest.getInstance("SHA-256")
|
||||||
digestWrapper.update(script.text.toByteArray())
|
|
||||||
|
fun addToDigest(chunk: String) = with(digestWrapper) {
|
||||||
|
val chunkBytes = chunk.toByteArray()
|
||||||
|
update(chunkBytes.size.toByteArray())
|
||||||
|
update(chunkBytes)
|
||||||
|
}
|
||||||
|
|
||||||
|
digestWrapper.update(COMPILED_SCRIPTS_CACHE_VERSION.toByteArray())
|
||||||
|
addToDigest(script.text)
|
||||||
scriptCompilationConfiguration.notTransientData.entries
|
scriptCompilationConfiguration.notTransientData.entries
|
||||||
.sortedBy { it.key.name }
|
.sortedBy { it.key.name }
|
||||||
.forEach {
|
.forEach {
|
||||||
digestWrapper.update(it.key.name.toByteArray())
|
addToDigest(it.key.name)
|
||||||
digestWrapper.update(it.value.toString().toByteArray())
|
addToDigest(it.value.toString())
|
||||||
}
|
}
|
||||||
return digestWrapper.digest().toHexString()
|
return digestWrapper.digest().toHexString()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun ByteArray.toHexString(): String = joinToString("", transform = { "%02x".format(it) })
|
private fun ByteArray.toHexString(): String = joinToString("", transform = { "%02x".format(it) })
|
||||||
|
|
||||||
|
private fun Int.toByteArray() = ByteBuffer.allocate(Int.SIZE_BYTES).also { it.putInt(this) }.array()
|
||||||
|
|||||||
Reference in New Issue
Block a user