Skip to content

Commit

Permalink
Fix compatibility with Gradle < 8.6 (#131)
Browse files Browse the repository at this point in the history
  • Loading branch information
ogolberg authored Nov 11, 2024
1 parent 733239b commit 6ba5291
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 28 deletions.
68 changes: 42 additions & 26 deletions plugin/src/main/kotlin/com/toasttab/expediter/gradle/Sources.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import org.gradle.api.artifacts.ArtifactCollection
import org.gradle.api.artifacts.component.ModuleComponentIdentifier
import org.gradle.api.artifacts.component.ProjectComponentIdentifier
import org.gradle.api.attributes.AttributeContainer
import org.gradle.api.capabilities.Capability
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.FileSystemLocation
import org.gradle.api.internal.artifacts.configurations.ArtifactCollectionInternal
Expand All @@ -26,33 +27,48 @@ fun ResolvableArtifact.source() = when (id.componentIdentifier) {
else -> ClassfileSource(file, ClassfileSourceType.UNKNOWN)
}

// Note that ArtifactCollection.artifactFiles coalesces multiple files associated
// with the same artifact; for example, when a project dependency has multiple outputs
// (e.g. build/classes/kotlin/main and build/classes/java/main), only one of those
// outputs will be present in ArtifactCollection.artifactFiles.
//
// To deal with that, we visit all artifacts, similarly to the implementation
// of ArtifactCollection.artifactFiles, but we don't coalesce the files.
class ArtifactCollectingVisitor : ArtifactVisitor {
private val sources = mutableListOf<ClassfileSource>()

override fun visitArtifact(
variantName: DisplayName,
variantAttributes: AttributeContainer,
capabilities: ImmutableCapabilities,
artifact: ResolvableArtifact
) {
sources.add(artifact.source())
}

// the ArtifactVisitor API changed in Gradle 8.6
// we also implement the old method for compatibility with Gradle < 8.6
fun visitArtifact(
variantName: DisplayName,
variantAttributes: AttributeContainer,
capabilities: List<Capability>,
artifact: ResolvableArtifact
) {
sources.add(artifact.source())
}

override fun requireArtifactFiles() = true

override fun visitFailure(failure: Throwable) {
}

fun sources() = sources
}

private fun ArtifactCollectionInternal.sources(): Collection<ClassfileSource> {
val sources = mutableListOf<ClassfileSource>()

// Note that ArtifactCollection.artifactFiles coalesces multiple files associated
// with the same artifact; for example, when a project dependency has multiple outputs
// (e.g. build/classes/kotlin/main and build/classes/java/main), only one of those
// outputs will be present in ArtifactCollection.artifactFiles.
//
// To deal with that, we visit all artifacts, similarly to the implementation
// of ArtifactCollection.artifactFiles, but we don't coalesce the files.
visitArtifacts(object : ArtifactVisitor {
override fun visitArtifact(
variantName: DisplayName,
variantAttributes: AttributeContainer,
capabilities: ImmutableCapabilities,
artifact: ResolvableArtifact
) {
sources.add(artifact.source())
}

override fun requireArtifactFiles() = true

override fun visitFailure(failure: Throwable) {
}
})

return sources
val visitor = ArtifactCollectingVisitor()
visitArtifacts(visitor)
return visitor.sources()
}

fun Collection<ArtifactCollection>.sources() = flatMapTo(LinkedHashSet()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import strikt.assertions.filterIsInstance
import strikt.assertions.isEmpty
import kotlin.io.path.readText

@TestKit(gradleVersions = ["8.6", "8.10.1"])
@TestKit(gradleVersions = ["8.6", "8.10.2"])
class ExpediterPluginIntegrationTest {
@ParameterizedWithGradleVersions
fun `android compat`(project: TestProject) {
Expand Down Expand Up @@ -298,7 +298,7 @@ class ExpediterPluginIntegrationTest {
expectThat(report.issues).filterIsInstance<Issue.DuplicateType>().isEmpty()
}

@ParameterizedWithGradleVersions
@ParameterizedWithGradleVersions(["8.5", "8.10.2"])
fun `multiple outputs`(project: TestProject) {
project.build("check")
}
Expand Down

0 comments on commit 6ba5291

Please sign in to comment.