Skip to content

Commit 41aaac4

Browse files
fix: 'reason' works for project dependencies.
1 parent c2339dc commit 41aaac4

File tree

10 files changed

+108
-342
lines changed

10 files changed

+108
-342
lines changed

src/functionalTest/groovy/com/autonomousapps/jvm/ReasonSpec.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ final class ReasonSpec extends AbstractJvmSpec {
8686
8787
then:
8888
assertThat(result.output).contains(
89-
"> Coordinates 'com.squareup.okio:oki' matches more than 1 dependency [com.squareup.okio:okio-jvm:3.0.0, com.squareup.okio:okio:3.0.0]")
89+
"> Coordinates 'com.squareup.okio:oki' matches more than 1 dependency: [com.squareup.okio:okio-jvm:3.0.0, com.squareup.okio:okio:3.0.0]")
9090
9191
where:
9292
gradleVersion << gradleVersions()
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright (c) 2025. Tony Robalik.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package com.autonomousapps.internal
4+
5+
import com.autonomousapps.model.Coordinates
6+
import com.autonomousapps.model.internal.intermediates.Usage
7+
8+
internal data class UsageContainer(val usages: List<UsagePair>) {
9+
fun toMap(): Map<Coordinates, Set<Usage>> {
10+
return usages.associate { (coordinates, usages) ->
11+
coordinates to usages
12+
}
13+
}
14+
15+
companion object {
16+
fun of(map: Map<Coordinates, Set<Usage>>): UsageContainer {
17+
return UsageContainer(map.entries.map(UsagePair::of))
18+
}
19+
}
20+
21+
internal data class UsagePair(val coordinates: Coordinates, val usages: Set<Usage>) {
22+
companion object {
23+
fun of(entry: Map.Entry<Coordinates, Set<Usage>>): UsagePair {
24+
return UsagePair(entry.key, entry.value)
25+
}
26+
}
27+
}
28+
}

src/main/kotlin/com/autonomousapps/internal/reason/DependencyAdviceExplainer.kt

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ import com.autonomousapps.tasks.ReasonTask
2121
@Suppress("UnstableApiUsage") // guava
2222
internal class DependencyAdviceExplainer(
2323
private val project: ProjectCoordinates,
24+
private val buildPath: String,
2425
private val requested: Coordinates,
25-
private val target: Coordinates,
2626
private val requestedCapability: String,
2727
private val usages: Set<Usage>,
2828
private val advice: Set<Advice>,
@@ -129,22 +129,22 @@ internal class DependencyAdviceExplainer(
129129

130130
// TODO(tsr): what are the valid scenarios? How many traces could there be for a single target?
131131
private fun findTrace(): BundleTrace? = bundleTraces.find { trace ->
132-
trace.top.gav() == target.gav() || trace.bottom.gav() == target.gav()
132+
trace.top.gav() == requested.gav() || trace.bottom.gav() == requested.gav()
133133
}
134134

135135
private fun StringBuilder.printGraph(graphView: DependencyGraphView) {
136136
val name = graphView.configurationName
137137

138138
// Find the complete Coordinates (including variant identification) in the graph (if available)
139-
val targetInGraph = graphView.graph.nodes().firstOrNull { coordinates ->
140-
coordinates.identifier == target.identifier && matchesTargetCapabilities(coordinates)
139+
val targetInGraph = graphView.graph.nodes().firstOrNull { node ->
140+
node.normalized(buildPath) == requested
141141
}
142142

143143
if (targetInGraph == null) {
144144
appendReproducibleNewLine()
145145
append(Colors.BOLD)
146146
appendReproducibleNewLine(
147-
"There is no path from ${project.printableName()} to ${printableIdentifier(target)} for $name"
147+
"There is no path from ${project.printableName()} to ${printableIdentifier(requested)} for $name"
148148
)
149149
appendReproducibleNewLine(Colors.NORMAL)
150150
return
@@ -168,13 +168,6 @@ internal class DependencyAdviceExplainer(
168168
}
169169
}
170170

171-
private fun matchesTargetCapabilities(coordinates: Coordinates): Boolean {
172-
// If their GVIs exactly match
173-
return coordinates.gradleVariantIdentification == target.gradleVariantIdentification
174-
// Or if the target isn't requesting on a capability and the coordinates have only the default capability.
175-
|| (target.gradleVariantIdentification.capabilities.isEmpty() && coordinates.hasDefaultCapability())
176-
}
177-
178171
private fun StringBuilder.printCapabilities(node: Coordinates) {
179172
val capabilities = node.gradleVariantIdentification.capabilities.filterNot { it == node.identifier }
180173

src/main/kotlin/com/autonomousapps/internal/utils/CoordinatesString.kt

Lines changed: 0 additions & 198 deletions
This file was deleted.

src/main/kotlin/com/autonomousapps/model/Coordinates.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public sealed class Coordinates(
7777
}.sorted()
7878

7979
internal fun hasDefaultCapability(): Boolean {
80-
return gradleVariantIdentification.capabilities.singleOrNull { it == identifier } != null
80+
return gradleVariantIdentification.capabilities.isEmpty() || gradleVariantIdentification.capabilities.singleOrNull { it == identifier } != null
8181
}
8282

8383
/**

src/main/kotlin/com/autonomousapps/subplugin/ProjectPlugin.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1156,7 +1156,6 @@ internal class ProjectPlugin(private val project: Project) {
11561156
}
11571157

11581158
reasonTask = tasks.register("reason", ReasonTask::class.java) {
1159-
it.rootProjectName.set(rootProject.name)
11601159
it.projectPath.set(theProjectPath)
11611160
it.buildPath.set(buildPath(buildscript.configurations.named("classpath")))
11621161
it.dependencyMap.set(dagpExtension.dependenciesHandler.map)

src/main/kotlin/com/autonomousapps/tasks/ComputeAdviceTask.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ package com.autonomousapps.tasks
44

55
import com.autonomousapps.extension.DependenciesHandler
66
import com.autonomousapps.internal.Bundles
7+
import com.autonomousapps.internal.UsageContainer
78
import com.autonomousapps.internal.transform.StandardTransform
89
import com.autonomousapps.internal.utils.*
9-
import com.autonomousapps.internal.utils.CoordinatesString.Companion.toStringCoordinates
1010
import com.autonomousapps.model.*
1111
import com.autonomousapps.model.internal.DependencyGraphView
1212
import com.autonomousapps.model.internal.declaration.Bucket
@@ -221,9 +221,8 @@ public abstract class ComputeAdviceTask @Inject constructor(
221221
)
222222

223223
output.bufferWriteJson(projectAdvice)
224-
// These must be transformed so that the Coordinates are Strings for serialization
225-
dependencyUsagesOut.bufferWriteJsonMap(toStringCoordinates(dependencyUsages, buildPath))
226-
annotationProcessorUsagesOut.bufferWriteJsonMap(toStringCoordinates(annotationProcessorUsages, buildPath))
224+
dependencyUsagesOut.bufferWriteJson(UsageContainer.of(dependencyUsages))
225+
annotationProcessorUsagesOut.bufferWriteJson(UsageContainer.of(annotationProcessorUsages))
227226
bundleTraces.bufferWriteJsonSet(dependencyAdviceBuilder.bundledTraces)
228227
}
229228

0 commit comments

Comments
 (0)