import org.gradle.api.file.FileCollection import java.io.OutputStream.nullOutputStream import java.security.DigestOutputStream import java.security.MessageDigest import java.util.* fun checksumFiles( files: FileCollection, includes: List = emptyList(), excludes: List = emptyList(), ): String { val content = files.asFileTree.matching { include(includes) exclude(excludes) } val messageDigester = MessageDigest.getInstance("SHA-256") DigestOutputStream(nullOutputStream(), messageDigester).use { digestStream -> content.visit { // hash relative path, based on the common root dir of all files in the FileCollection digestStream.write(relativePath.pathString.toByteArray()) // hash file content file.inputStream().use { fis -> fis.copyTo(digestStream) } } } return Base64.getEncoder().encodeToString(messageDigester.digest()) }