build(modules): add :modules:reportModuleOrder task (#4568)

develop
Kevin Turner 2022-04-03 14:38:10 -07:00 committed by GitHub
parent 1196034fd4
commit a9b9db5942
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 74 additions and 0 deletions

View File

@ -34,6 +34,9 @@ dependencies {
implementation("org.javassist:javassist:3.27.0-GA")
implementation("dom4j:dom4j:1.6.1")
// graph analysis
implementation("org.jgrapht:jgrapht-core:1.5.0")
// for inspecting modules
implementation("org.terasology.gestalt:gestalt-module:7.1.0")

View File

@ -8,11 +8,15 @@ import org.gradle.api.artifacts.ModuleIdentifier
import org.gradle.api.artifacts.component.ModuleComponentIdentifier
import org.gradle.api.artifacts.component.ProjectComponentIdentifier
import org.gradle.api.artifacts.result.ResolvedArtifactResult
import org.gradle.api.artifacts.result.ResolvedComponentResult
import org.gradle.api.artifacts.result.ResolvedDependencyResult
import org.gradle.api.artifacts.result.UnresolvedDependencyResult
import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging
import org.gradle.api.provider.Provider
import org.jgrapht.Graph
import org.jgrapht.graph.DefaultDirectedGraph
import org.jgrapht.traverse.TopologicalOrderIterator
val ModuleIdentifier.isTerasologyModule: Boolean
get() = group == TERASOLOGY_MODULES_GROUP
@ -82,3 +86,62 @@ fun moduleDependencyArtifacts(modulesConfig: Configuration): Iterable<ResolvedAr
}
fun moduleDependencyOrdering(modulesConfig: Configuration): List<String> {
// configurations.resolvedConfiguration is more straightforward if you just want all the artifacts,
// but using `.incoming` lets us turn on lenient mode as well as do more accurate filtering of local modules
val resolvable = modulesConfig.incoming
val artifactView = resolvable.artifactView {
lenient(true)
}
val result = resolvable.resolutionResult
val allDependencies = result.allDependencies
val resolvedDependencies = allDependencies.mapNotNull {
if (it is ResolvedDependencyResult) {
return@mapNotNull it
}
if (it is UnresolvedDependencyResult) {
logger.warn("Dependency {} of {} not resolved:", it.attempted, it.from, it.failure)
} else {
logger.warn(
"Dependency {} of {} not resolved: Unexpected result class {}\n{}",
it.requested,
it.from,
it::class,
it
)
}
null
}
val g: Graph<ResolvedComponentResult, ResolvedDependencyResult> = DefaultDirectedGraph(ResolvedDependencyResult::class.java)
fun isModule(p: ResolvedComponentResult): Boolean {
val projectPath = (p.id as? ProjectComponentIdentifier)?.projectPath
return projectPath?.run {
startsWith(":modules:") || equals(":engine")
} ?: false
}
result.allComponents
.filter(::isModule)
.forEach { g.addVertex(it) }
result.allDependencies
.mapNotNull {
it as? ResolvedDependencyResult
}
.filter {
isModule(it.from) && isModule(it.selected)
}
.forEach {
g.addEdge(it.from, it.selected, it)
}
val nodes = TopologicalOrderIterator(g)
return nodes.asSequence()
.mapNotNull { it.id as? ProjectComponentIdentifier }
.map { it.projectName }
.toList().asReversed()
}

View File

@ -3,11 +3,13 @@
import org.terasology.gradology.JAR_COLLECTION
import org.terasology.gradology.moduleDependencyArtifacts
import org.terasology.gradology.moduleDependencyOrdering
import org.terasology.gradology.namedAttribute
plugins {
id("terasology-repositories")
`java-platform`
`project-report`
}
@Suppress("PropertyName")
@ -67,3 +69,9 @@ tasks.named("clean").configure {
cleanModules.dependsOn(this.tasks.named("clean"))
}
}
val reportModuleOrder by tasks.registering {
moduleDependencyOrdering(configurations.getByName("classpath")).forEach {
println(it)
}
}