#!/usr/bin/env kotlin //install kotlin compiler: https://kotlinlang.org/docs/tutorials/command-line.html import java.io.File val includeRegex = Regex("include\\(\"(.*?)\"\\)") val projectRegex = "project\\(\"([^\"]+)\"(, configuration = \".*\")?\\)".toRegex() val keepModules = mutableSetOf() var root = "" main(args) fun main(args: Array) { if (args.isEmpty()) { println("Usage: ./docs/contributing/selectModules.kts instrumentation/spring/spring-boot-autoconfigure/ ...") return } (args.map { moduleOfArg( File(File(it).absolutePath), "/" + it.trimStart('.', '/').trimEnd('/') ) } + listOf(":javaagent")) .map { Module(it) } .forEach(Module::addSelfAndChildren) File("$root/conventions/src/main/kotlin").listFiles()!! .filter { it.name.endsWith(".kts") } .forEach { children(it).forEach(Module::addSelfAndChildren) } println("removing modules except:\n${keepModules.map { it.name }.sorted().joinToString("\n")}") val target = File("$root/settings.gradle.kts") val text = target.readText().lines().flatMap { line -> includeRegex.matchEntire(line)?.let { it.groupValues[1] }?.let { module -> if (Module(module) in keepModules) { listOf(line) } else { emptyList() } } ?: listOf(line) }.joinToString("\n") target.writeText(text) } data class Module(val name: String) { fun children(): List { val file = moduleFile() return children(file) } private fun moduleFile(): File = File("$root/${name.replace(":", "/")}/build.gradle.kts") fun addSelfAndChildren() { if (!keepModules.add(this)) { return } children().forEach(Module::addSelfAndChildren) } } fun moduleOfArg(file: File, name: String): String { val settings = File(file, "settings.gradle.kts") return if (settings.exists()) { root = file.absolutePath name.substringAfter(root).replace("/", ":") } else { moduleOfArg(file.parentFile, name) } } fun children(file: File) = file.readText().lines().flatMap { line -> projectRegex.find(line)?.let { it.groupValues[1] }?.let { module -> listOf(Module(module)) } ?: emptyList() }