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
import dev.minutest.Tests
import dev.minutest.experimental.minus
import dev.minutest.junit.JUnit5Minutests
import dev.minutest.rootContext
import dev.minutest.test
@@ -11,14 +12,25 @@ class SettingsTest : JUnit5Minutests {
@Tests
fun tests() = rootContext("settings tests") {
withRepository("m2") {
withFixture("settings/buildscript") {
test("resolves settings plugin in buildscript classpath") {
expectThat(build()) {
get("settings dependencies") { settingsDependencies }.ids
.containsExactly(
"org.apache:test:1.0.0@jar",
"org.apache:test:1.0.0@pom"
)
get("settings dependencies") { settingsDependencies }.ids.containsExactly(
"org.apache:test:1.0.0@jar",
"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(
project: Project,
scope: ConfigurationScope,
repositories: RepositoryHandler
repositories: List<ResolutionAwareRepository>
) {
private val ivySettings = IvySettings().apply {
defaultInit()
@@ -49,7 +49,6 @@ internal class ConfigurationResolverFactory(
}
private val resolvers = repositories
.filterIsInstance<ResolutionAwareRepository>()
.filterNot { it.createResolver().isLocal }
.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.ProjectDependency
import org.gradle.api.internal.GradleInternal
import org.gradle.api.internal.artifacts.repositories.ResolutionAwareRepository
import org.gradle.api.invocation.Gradle
import org.gradle.api.tasks.TaskContainer
import org.gradle.api.tasks.wrapper.Wrapper
@@ -132,7 +133,11 @@ private fun Project.buildGradle(): DefaultGradle =
private fun Project.settingsDependencies(): List<DefaultArtifact> {
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)
logger.lifecycle(" Settings script")
@@ -208,7 +213,11 @@ private fun Project.buildProject(
private fun Project.buildscriptDependencies(
pluginArtifacts: List<DefaultArtifact>
): 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 pluginIds = pluginArtifacts.map(DefaultArtifact::id)
return buildscript.configurations
@@ -221,8 +230,11 @@ private fun Project.buildscriptDependencies(
private fun Project.projectDependencies(
explicitConfigurations: List<String>
): Pair<List<DefaultArtifact>, List<ArtifactIdentifier>> {
val resolverFactory = ConfigurationResolverFactory(this, ConfigurationScope.PROJECT, repositories)
val resolver = resolverFactory.create(dependencies)
val resolver = ConfigurationResolverFactory(
this,
ConfigurationScope.PROJECT,
RepositoriesCollector.create(project).collectRepositories()
).create(dependencies)
return collectConfigurations(explicitConfigurations)
.flatMap(resolver::resolve)
.distinct()

View File

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