plugin: Support repositories in dependencyResolutionManagement block

This commit is contained in:
Tad Fisher
2021-02-03 10:24:18 -08:00
parent 80b8a7d52e
commit 9c705b5f1b
8 changed files with 7702 additions and 14 deletions

View File

@@ -0,0 +1,7 @@
plugins {
java
}
dependencies {
implementation("org.apache:test:1.0.0")
}

View File

@@ -0,0 +1,6 @@
dependencyResolutionManagement {
repositories {
maven { url = uri("http://localhost:9999") }
}
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,7 @@
package org.nixos.gradle2nix package org.nixos.gradle2nix
import dev.minutest.Tests import dev.minutest.Tests
import dev.minutest.experimental.minus
import dev.minutest.junit.JUnit5Minutests import dev.minutest.junit.JUnit5Minutests
import dev.minutest.rootContext import dev.minutest.rootContext
import dev.minutest.test import dev.minutest.test
@@ -11,14 +12,25 @@ class SettingsTest : JUnit5Minutests {
@Tests @Tests
fun tests() = rootContext("settings tests") { fun tests() = rootContext("settings tests") {
withRepository("m2") { withRepository("m2") {
withFixture("settings/buildscript") { withFixture("settings/buildscript") {
test("resolves settings plugin in buildscript classpath") { test("resolves settings plugin in buildscript classpath") {
expectThat(build()) { expectThat(build()) {
get("settings dependencies") { settingsDependencies }.ids get("settings dependencies") { settingsDependencies }.ids.containsExactly(
.containsExactly( "org.apache:test:1.0.0@jar",
"org.apache:test:1.0.0@jar", "org.apache:test:1.0.0@pom"
"org.apache:test:1.0.0@pom" )
) }
}
}
withFixture("settings/dependency-resolution-management") {
GRADLE_MIN("6.8") - test("uses repositories from settings script") {
expectThat(build()) {
get("root project dependencies") { rootProject.projectDependencies }.ids.containsExactly(
"org.apache:test:1.0.0@jar",
"org.apache:test:1.0.0@pom"
)
} }
} }
} }

View File

@@ -35,7 +35,7 @@ enum class ConfigurationScope {
internal class ConfigurationResolverFactory( internal class ConfigurationResolverFactory(
project: Project, project: Project,
scope: ConfigurationScope, scope: ConfigurationScope,
repositories: RepositoryHandler repositories: List<ResolutionAwareRepository>
) { ) {
private val ivySettings = IvySettings().apply { private val ivySettings = IvySettings().apply {
defaultInit() defaultInit()
@@ -49,7 +49,6 @@ internal class ConfigurationResolverFactory(
} }
private val resolvers = repositories private val resolvers = repositories
.filterIsInstance<ResolutionAwareRepository>()
.filterNot { it.createResolver().isLocal } .filterNot { it.createResolver().isLocal }
.mapNotNull { it.repositoryResolver(project, scope, ivySettings) } .mapNotNull { it.repositoryResolver(project, scope, ivySettings) }

View File

@@ -7,6 +7,7 @@ import org.gradle.api.Task
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.ProjectDependency import org.gradle.api.artifacts.ProjectDependency
import org.gradle.api.internal.GradleInternal import org.gradle.api.internal.GradleInternal
import org.gradle.api.internal.artifacts.repositories.ResolutionAwareRepository
import org.gradle.api.invocation.Gradle import org.gradle.api.invocation.Gradle
import org.gradle.api.tasks.TaskContainer import org.gradle.api.tasks.TaskContainer
import org.gradle.api.tasks.wrapper.Wrapper import org.gradle.api.tasks.wrapper.Wrapper
@@ -132,7 +133,11 @@ private fun Project.buildGradle(): DefaultGradle =
private fun Project.settingsDependencies(): List<DefaultArtifact> { private fun Project.settingsDependencies(): List<DefaultArtifact> {
val buildscript = (gradle as GradleInternal).settings.buildscript val buildscript = (gradle as GradleInternal).settings.buildscript
val resolverFactory = ConfigurationResolverFactory(this, ConfigurationScope.SETTINGS, buildscript.repositories) val resolverFactory = ConfigurationResolverFactory(
this,
ConfigurationScope.SETTINGS,
buildscript.repositories.filterIsInstance<ResolutionAwareRepository>()
)
val resolver = resolverFactory.create(buildscript.dependencies) val resolver = resolverFactory.create(buildscript.dependencies)
logger.lifecycle(" Settings script") logger.lifecycle(" Settings script")
@@ -208,7 +213,11 @@ private fun Project.buildProject(
private fun Project.buildscriptDependencies( private fun Project.buildscriptDependencies(
pluginArtifacts: List<DefaultArtifact> pluginArtifacts: List<DefaultArtifact>
): Pair<List<DefaultArtifact>, List<ArtifactIdentifier>> { ): Pair<List<DefaultArtifact>, List<ArtifactIdentifier>> {
val resolverFactory = ConfigurationResolverFactory(this, ConfigurationScope.BUILDSCRIPT, buildscript.repositories) val resolverFactory = ConfigurationResolverFactory(
this,
ConfigurationScope.BUILDSCRIPT,
buildscript.repositories.filterIsInstance<ResolutionAwareRepository>()
)
val resolver = resolverFactory.create(buildscript.dependencies) val resolver = resolverFactory.create(buildscript.dependencies)
val pluginIds = pluginArtifacts.map(DefaultArtifact::id) val pluginIds = pluginArtifacts.map(DefaultArtifact::id)
return buildscript.configurations return buildscript.configurations
@@ -221,8 +230,11 @@ private fun Project.buildscriptDependencies(
private fun Project.projectDependencies( private fun Project.projectDependencies(
explicitConfigurations: List<String> explicitConfigurations: List<String>
): Pair<List<DefaultArtifact>, List<ArtifactIdentifier>> { ): Pair<List<DefaultArtifact>, List<ArtifactIdentifier>> {
val resolverFactory = ConfigurationResolverFactory(this, ConfigurationScope.PROJECT, repositories) val resolver = ConfigurationResolverFactory(
val resolver = resolverFactory.create(dependencies) this,
ConfigurationScope.PROJECT,
RepositoriesCollector.create(project).collectRepositories()
).create(dependencies)
return collectConfigurations(explicitConfigurations) return collectConfigurations(explicitConfigurations)
.flatMap(resolver::resolve) .flatMap(resolver::resolve)
.distinct() .distinct()

View File

@@ -1,6 +1,7 @@
package org.nixos.gradle2nix package org.nixos.gradle2nix
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.internal.artifacts.repositories.ResolutionAwareRepository
import org.gradle.plugin.management.PluginRequest import org.gradle.plugin.management.PluginRequest
import org.gradle.plugin.use.internal.PluginDependencyResolutionServices import org.gradle.plugin.use.internal.PluginDependencyResolutionServices
import javax.inject.Inject import javax.inject.Inject
@@ -14,7 +15,7 @@ internal open class PluginResolver @Inject constructor(
private val resolver = ConfigurationResolverFactory( private val resolver = ConfigurationResolverFactory(
project, project,
ConfigurationScope.PLUGIN, ConfigurationScope.PLUGIN,
pluginDependencyResolutionServices.resolveRepositoryHandler pluginDependencyResolutionServices.resolveRepositoryHandler.filterIsInstance<ResolutionAwareRepository>()
).create(pluginDependencyResolutionServices.dependencyHandler) ).create(pluginDependencyResolutionServices.dependencyHandler)
fun resolve(pluginRequests: List<PluginRequest>): List<DefaultArtifact> { fun resolve(pluginRequests: List<PluginRequest>): List<DefaultArtifact> {
@@ -28,4 +29,3 @@ internal open class PluginResolver @Inject constructor(
return resolver.resolve(configurations.detachedConfiguration(*markerDependencies.toTypedArray())) return resolver.resolve(configurations.detachedConfiguration(*markerDependencies.toTypedArray()))
} }
} }

View File

@@ -0,0 +1,37 @@
package org.nixos.gradle2nix
import org.gradle.api.internal.artifacts.repositories.ResolutionAwareRepository
import org.gradle.api.Project
import org.gradle.api.artifacts.dsl.RepositoryHandler
import org.gradle.api.initialization.dsl.ScriptHandler
import org.gradle.api.internal.artifacts.RepositoriesSupplier
import org.gradle.kotlin.dsl.newInstance
import org.gradle.util.GradleVersion
import javax.inject.Inject
interface RepositoriesCollector {
fun collectRepositories(): List<ResolutionAwareRepository>
companion object {
fun create(project: Project): RepositoriesCollector =
if (GradleVersion.current() >= GradleVersion.version("6.8")) {
project.objects.newInstance<RepositoriesCollector68>()
} else {
project.objects.newInstance<RepositoriesCollectorBase>()
}
}
}
open class RepositoriesCollectorBase @Inject constructor(
private val repositories: RepositoryHandler
): RepositoriesCollector {
override fun collectRepositories(): List<ResolutionAwareRepository> =
repositories.filterIsInstance<ResolutionAwareRepository>()
}
open class RepositoriesCollector68 @Inject constructor(
private val repositoriesSupplier: RepositoriesSupplier
): RepositoriesCollector {
override fun collectRepositories(): List<ResolutionAwareRepository> =
repositoriesSupplier.get()
}