Support downloading additional artifacts (sources, javadoc, etc.)

This commit is contained in:
Tad Fisher
2025-01-17 11:44:31 -08:00
committed by Tad Fisher
parent f8c0afcd29
commit 96a444c22b
30 changed files with 1985 additions and 366 deletions

View File

@@ -3,27 +3,56 @@ package org.nixos.gradle2nix
import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.component.ModuleComponentIdentifier
import org.gradle.api.file.FileCollection
import org.gradle.api.invocation.Gradle
import org.gradle.api.logging.Logging
import org.gradle.api.model.ObjectFactory
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.TaskAction
import org.gradle.internal.deprecation.DeprecatableConfiguration
import org.nixos.gradle2nix.model.ARTIFACTS_PROPERTY
import org.nixos.gradle2nix.model.ArtifactType
import org.nixos.gradle2nix.model.RESOLVE_ALL_TASK
import org.nixos.gradle2nix.model.RESOLVE_PROJECT_TASK
import javax.inject.Inject
fun interface ResolveAllArtifactsApplier {
fun apply(gradle: Gradle)
}
val Project.reportableConfigurations: List<Configuration>
get() = configurations.filter { (it as? DeprecatableConfiguration)?.canSafelyBeResolved() ?: it.isCanBeResolved }
abstract class AbstractResolveAllArtifactsApplier : ResolveAllArtifactsApplier {
abstract fun Project.registerProjectTask(): TaskProvider<*>
abstract fun Project.addConfigurationArtifactResolver(
configuration: Configuration,
artifactType: ArtifactType,
): FileCollection
final override fun apply(gradle: Gradle) {
val resolveAll = gradle.rootProject.tasks.register(RESOLVE_ALL_TASK)
val artifacts =
System
.getProperty(ARTIFACTS_PROPERTY, "")
.split(",")
.filter { it.isNotBlank() }
.mapTo(mutableSetOf()) { ArtifactType.valueOf(it.toUpperCase()) }
// Depend on "dependencies" task in all projects
gradle.allprojects { project ->
val resolveProject = project.registerProjectTask()
val resolveProject =
project.tasks.register(RESOLVE_PROJECT_TASK, ResolveProjectDependenciesTask::class.java) { task ->
task.projectName.set(project.path)
for (configuration in project.reportableConfigurations) {
task.configurations.from(configuration)
for (artifactType in artifacts) {
task.configurations.from(project.addConfigurationArtifactResolver(configuration, artifactType))
}
}
}
resolveAll.configure { it.dependsOn(resolveProject) }
}
@@ -36,17 +65,25 @@ abstract class AbstractResolveAllArtifactsApplier : ResolveAllArtifactsApplier {
}
}
abstract class ResolveProjectDependenciesTask : DefaultTask() {
@Internal
protected fun getReportableConfigurations(): List<Configuration> =
project.configurations.filter {
(it as? DeprecatableConfiguration)?.canSafelyBeResolved() ?: true
@Suppress("UnstableApiUsage")
abstract class ResolveProjectDependenciesTask
@Inject
constructor(
objects: ObjectFactory,
) : DefaultTask() {
@get:Internal
val projectName = objects.property(String::class.java)
@get:InputFiles
val configurations = objects.fileCollection()
@TaskAction
fun resolve() {
val count = configurations.count()
LOGGER.info("${projectName.get()}: resolved $count artifacts")
}
protected fun Configuration.artifactFiles(): FileCollection =
incoming
.artifactView { viewConfiguration ->
viewConfiguration.isLenient = true
viewConfiguration.componentFilter { it is ModuleComponentIdentifier }
}.files
}
companion object {
private val LOGGER = Logging.getLogger(ResolveProjectDependenciesTask::class.java)
}
}