[Gradle, JS] Fix ProcessedFilesCache.kt according to configuration cache
This commit is contained in:
committed by
TeamCityServer
parent
b138b166e3
commit
80a0545ac2
+37
-13
@@ -11,6 +11,7 @@ import com.google.gson.stream.JsonToken
|
|||||||
import com.google.gson.stream.JsonWriter
|
import com.google.gson.stream.JsonWriter
|
||||||
import org.gradle.api.logging.Logger
|
import org.gradle.api.logging.Logger
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.security.MessageDigest
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cache for preventing processing some files twice.
|
* Cache for preventing processing some files twice.
|
||||||
@@ -22,16 +23,13 @@ import java.io.File
|
|||||||
*
|
*
|
||||||
* @param version When updating logic in `compute`, `version` should be increased to invalidate cache
|
* @param version When updating logic in `compute`, `version` should be increased to invalidate cache
|
||||||
*/
|
*/
|
||||||
// CHECK
|
|
||||||
internal open class ProcessedFilesCache(
|
internal open class ProcessedFilesCache(
|
||||||
val logger: Logger,
|
val logger: Logger,
|
||||||
// val hasher: FileHasher,
|
|
||||||
val projectDir: File,
|
val projectDir: File,
|
||||||
val targetDir: File,
|
val targetDir: File,
|
||||||
stateFileName: String,
|
stateFileName: String,
|
||||||
val version: String
|
val version: String
|
||||||
) : AutoCloseable {
|
) : AutoCloseable {
|
||||||
|
|
||||||
private fun readFrom(json: JsonReader): State? {
|
private fun readFrom(json: JsonReader): State? {
|
||||||
val result = State()
|
val result = State()
|
||||||
|
|
||||||
@@ -71,7 +69,7 @@ internal open class ProcessedFilesCache(
|
|||||||
json.name("items")
|
json.name("items")
|
||||||
json.obj {
|
json.obj {
|
||||||
byHash.forEach {
|
byHash.forEach {
|
||||||
json.name(it.key.toHex())
|
json.name(it.key.contents.toHex())
|
||||||
json.obj {
|
json.obj {
|
||||||
json.name("src").value(it.value.src)
|
json.name("src").value(it.value.src)
|
||||||
json.name("target")
|
json.name("target")
|
||||||
@@ -95,12 +93,26 @@ internal open class ProcessedFilesCache(
|
|||||||
endObject()
|
endObject()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Int.toHex(): String {
|
fun ByteArray.toHex(): String {
|
||||||
return toString(16)
|
val result = CharArray(size * 2) { ' ' }
|
||||||
|
var i = 0
|
||||||
|
forEach {
|
||||||
|
val n = it.toInt()
|
||||||
|
result[i++] = Character.forDigit(n shr 4 and 0xF, 16)
|
||||||
|
result[i++] = Character.forDigit(n and 0xF, 16)
|
||||||
|
}
|
||||||
|
return String(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun decodeHexString(hexString: String): Int {
|
private fun decodeHexString(hexString: String): ByteArray {
|
||||||
return Integer.parseInt(hexString, 16)
|
check(hexString.length % 2 == 0)
|
||||||
|
val bytes = ByteArray(hexString.length / 2)
|
||||||
|
var i = 0
|
||||||
|
var o = 0
|
||||||
|
while (i < hexString.length) {
|
||||||
|
bytes[o++] = hexToByte(hexString[i++], hexString[i++])
|
||||||
|
}
|
||||||
|
return bytes
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun hexToByte(a: Char, b: Char): Byte = ((a.toDigit() shl 4) + b.toDigit()).toByte()
|
private fun hexToByte(a: Char, b: Char): Byte = ((a.toDigit() shl 4) + b.toDigit()).toByte()
|
||||||
@@ -125,13 +137,13 @@ internal open class ProcessedFilesCache(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class State {
|
private class State {
|
||||||
val byHash = mutableMapOf<Int, Element>()
|
val byHash = mutableMapOf<ByteArrayWrapper, Element>()
|
||||||
val byTarget = mutableMapOf<String, Element>()
|
val byTarget = mutableMapOf<String, Element>()
|
||||||
|
|
||||||
operator fun get(elementHash: Int) = byHash[elementHash]
|
operator fun get(elementHash: ByteArray) = byHash[ByteArrayWrapper(elementHash)]
|
||||||
|
|
||||||
operator fun set(elementHash: Int, element: Element) {
|
operator fun set(elementHash: ByteArray, element: Element) {
|
||||||
byHash[elementHash] = element
|
byHash[ByteArrayWrapper(elementHash)] = element
|
||||||
val target = element.target
|
val target = element.target
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
byTarget[target] = element
|
byTarget[target] = element
|
||||||
@@ -180,7 +192,19 @@ internal open class ProcessedFilesCache(
|
|||||||
file: File,
|
file: File,
|
||||||
compute: () -> File?
|
compute: () -> File?
|
||||||
): String? {
|
): String? {
|
||||||
val hash = file.hashCode()
|
val md = MessageDigest.getInstance("MD5")
|
||||||
|
val buffer = ByteArray(4048)
|
||||||
|
file.inputStream().use { input ->
|
||||||
|
while (true) {
|
||||||
|
val len = input.read(buffer)
|
||||||
|
if (len < 0) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
md.update(buffer, 0, len)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val hash = md.digest()
|
||||||
val old = state[hash]
|
val old = state[hash]
|
||||||
|
|
||||||
if (old != null) {
|
if (old != null) {
|
||||||
|
|||||||
-1
@@ -23,7 +23,6 @@ internal abstract class AbstractNodeModulesCache(nodeJs: NodeJsRootExtension) :
|
|||||||
internal val dir = nodeJs.nodeModulesGradleCacheDir
|
internal val dir = nodeJs.nodeModulesGradleCacheDir
|
||||||
private val cache = ProcessedFilesCache(
|
private val cache = ProcessedFilesCache(
|
||||||
nodeJs.rootProject.logger,
|
nodeJs.rootProject.logger,
|
||||||
// (nodeJs.rootProject as ProjectInternal).services.get(FileHasher::class.java),
|
|
||||||
nodeJs.rootProject.projectDir,
|
nodeJs.rootProject.projectDir,
|
||||||
dir,
|
dir,
|
||||||
STATE_FILE_NAME,
|
STATE_FILE_NAME,
|
||||||
|
|||||||
Reference in New Issue
Block a user