InputFingerprint.kt

package com.depanalyzer.core

import com.depanalyzer.parser.ProjectType
import java.nio.charset.StandardCharsets
import java.nio.file.Files
import java.nio.file.Path
import java.security.MessageDigest

object InputFingerprint {
    fun compute(projectDir: Path, projectType: ProjectType): String {
        val files = when (projectType) {
            ProjectType.MAVEN -> listOf("pom.xml")
            ProjectType.GRADLE_GROOVY -> listOf("build.gradle", "gradle.lockfile")
            ProjectType.GRADLE_KOTLIN -> listOf("build.gradle.kts", "gradle/libs.versions.toml", "gradle.lockfile")
            ProjectType.NPM -> listOf("package.json", "package-lock.json")
            ProjectType.PYTHON_POETRY -> listOf("pyproject.toml", "poetry.lock")
            ProjectType.PYTHON_REQUIREMENTS -> listOf("requirements.txt")
        }
        val digest = MessageDigest.getInstance("SHA-256")
        files.map(projectDir::resolve)
            .filter(Files::isRegularFile)
            .sortedBy { it.toString().replace('\\', '/') }
            .forEach { file ->
                digest.update(projectDir.relativize(file).toString().replace('\\', '/').toByteArray(StandardCharsets.UTF_8))
                digest.update(0)
                digest.update(Files.readAllBytes(file))
                digest.update(0)
            }
        return digest.digest().joinToString("") { "%02x".format(it) }
    }
}