[Gradle] Break cycles when iterating over all dependencies

Gradle DependencyResult can have cycles in its dependencies. So
keep track of visited dependencies.

^KT-49933
This commit is contained in:
Anton Lakotka
2023-01-13 08:50:54 +01:00
committed by Space Team
parent 32cb38e0d4
commit 007a2411cc
@@ -10,6 +10,7 @@ import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.ResolveException import org.gradle.api.artifacts.ResolveException
import org.gradle.api.artifacts.result.* import org.gradle.api.artifacts.result.*
import org.gradle.api.file.FileCollection import org.gradle.api.file.FileCollection
import org.jetbrains.kotlin.tooling.core.withClosure
/** /**
* Represents a Gradle Configuration that was resolved after configuration time. * Represents a Gradle Configuration that was resolved after configuration time.
@@ -41,12 +42,16 @@ private constructor(
private val artifactsByComponentId by TransientLazy { artifacts.groupBy { it.id.componentIdentifier } } private val artifactsByComponentId by TransientLazy { artifacts.groupBy { it.id.componentIdentifier } }
val allDependencies: List<DependencyResult> get() { val allDependencies: List<DependencyResult> get() {
fun DependencyResult.allDependenciesRecursive(): List<DependencyResult> = val visited = mutableSetOf<DependencyResult>()
if (this is ResolvedDependencyResult) { fun DependencyResult.allDependenciesRecursive(): List<DependencyResult> {
if (this in visited) return emptyList()
visited += this
return if (this is ResolvedDependencyResult) {
listOf(this) + selected.dependencies.flatMap { it.allDependenciesRecursive() } listOf(this) + selected.dependencies.flatMap { it.allDependenciesRecursive() }
} else { } else {
listOf(this) listOf(this)
} }
}
return root.dependencies.flatMap { it.allDependenciesRecursive() } return root.dependencies.flatMap { it.allDependenciesRecursive() }
} }