@@ -8,6 +8,7 @@ import com.autonomousapps.internal.graph.GraphWriter
88import com.autonomousapps.internal.utils.bufferWriteJson
99import com.autonomousapps.internal.utils.getAndDelete
1010import com.autonomousapps.internal.utils.mapNotNullToSet
11+ import com.autonomousapps.internal.utils.mapToOrderedSet
1112import com.autonomousapps.internal.utils.toCoordinates
1213import com.autonomousapps.model.Coordinates
1314import com.autonomousapps.model.CoordinatesContainer
@@ -18,6 +19,7 @@ import org.gradle.api.Project
1819import org.gradle.api.artifacts.Configuration
1920import org.gradle.api.artifacts.FileCollectionDependency
2021import org.gradle.api.artifacts.result.ResolvedComponentResult
22+ import org.gradle.api.artifacts.result.ResolvedDependencyResult
2123import org.gradle.api.file.ConfigurableFileCollection
2224import org.gradle.api.file.RegularFileProperty
2325import org.gradle.api.provider.Property
@@ -65,6 +67,14 @@ public abstract class GraphViewTask : DefaultTask() {
6567 @get:InputFile
6668 public abstract val declarations: RegularFileProperty
6769
70+ /* * Tracks resolved components so project dependency changes invalidate this task. */
71+ @get:Input
72+ public abstract val compileClasspathComponentIds: SetProperty <String >
73+
74+ /* * See [compileClasspathComponentIds]. */
75+ @get:Input
76+ public abstract val runtimeClasspathComponentIds: SetProperty <String >
77+
6878 /* * Needed to make sure task gives the same result if the build configuration in a composite changed between runs. */
6979 @get:Input
7080 public abstract val buildPath: Property <String >
@@ -118,6 +128,9 @@ public abstract class GraphViewTask : DefaultTask() {
118128 .mapNotNullToSet { it.toCoordinates() }
119129 })
120130
131+ compileClasspathComponentIds.set(compileClasspathResult.map { it.allComponentIds() })
132+ runtimeClasspathComponentIds.set(runtimeClasspathResult.map { it.allComponentIds() })
133+
121134 compileFiles.setFrom(project.provider { compileClasspath.externalArtifactsFor(jarAttr).artifactFiles })
122135 runtimeFiles.setFrom(project.provider { runtimeClasspath.externalArtifactsFor(jarAttr).artifactFiles })
123136 }
@@ -153,3 +166,21 @@ public abstract class GraphViewTask : DefaultTask() {
153166 outputRuntimeDot.writeText(graphWriter.toDot(runtimeGraph))
154167 }
155168}
169+
170+ private fun ResolvedComponentResult.allComponentIds (): Set <String > {
171+ val visited = mutableSetOf<ResolvedComponentResult >()
172+ val queue = ArrayDeque <ResolvedComponentResult >()
173+ queue.add(this )
174+
175+ while (queue.isNotEmpty()) {
176+ val node = queue.removeFirst()
177+ if (! visited.add(node)) {
178+ continue
179+ }
180+ node.dependencies.asSequence()
181+ .filterIsInstance<ResolvedDependencyResult >()
182+ .forEach { queue.add(it.selected) }
183+ }
184+
185+ return visited.mapToOrderedSet { it.id.displayName }
186+ }
0 commit comments