From b1347d76164b94ca0ca3ba6ec3fb6f0596e5a72d Mon Sep 17 00:00:00 2001 From: Ilya Muradyan Date: Thu, 14 Sep 2023 11:36:14 +0200 Subject: [PATCH] Scripting: Unify artifacts resolution for partial and non-partial cases --- .../dependencies/maven/impl/aether.kt | 72 +++++++------------ 1 file changed, 27 insertions(+), 45 deletions(-) diff --git a/libraries/scripting/dependencies-maven/src/kotlin/script/experimental/dependencies/maven/impl/aether.kt b/libraries/scripting/dependencies-maven/src/kotlin/script/experimental/dependencies/maven/impl/aether.kt index db042216eaf..4c13d96a898 100644 --- a/libraries/scripting/dependencies-maven/src/kotlin/script/experimental/dependencies/maven/impl/aether.kt +++ b/libraries/scripting/dependencies-maven/src/kotlin/script/experimental/dependencies/maven/impl/aether.kt @@ -39,9 +39,11 @@ import org.eclipse.aether.util.repository.AuthenticationBuilder import org.eclipse.aether.util.repository.DefaultMirrorSelector import org.eclipse.aether.util.repository.DefaultProxySelector import java.io.File +import kotlin.script.experimental.api.IterableResultsCollector import kotlin.script.experimental.api.ResultWithDiagnostics import kotlin.script.experimental.api.ScriptDiagnostic import kotlin.script.experimental.api.asSuccess +import kotlin.script.experimental.dependencies.impl.makeResolveFailureResult val mavenCentral: RemoteRepository = RemoteRepository.Builder("maven central", "default", "https://repo.maven.apache.org/maven2/").build() @@ -153,58 +155,54 @@ internal class AetherResolveSession( ): ResultWithDiagnostics> { if (kind == ResolutionKind.NON_TRANSITIVE) return resolveArtifacts(roots).asSuccess() - val requests = resolveTree(roots, scope, filter, classifier, extension) + val isOptional = kind == ResolutionKind.TRANSITIVE_PARTIAL + val requests = resolveTree(roots, scope, isOptional, filter, classifier, extension) - @Suppress("KotlinConstantConditions") - return when (kind) { - ResolutionKind.TRANSITIVE -> resolveDependencies(requests) { + val artifactResults = try { + synchronized(this) { repositorySystem.resolveArtifacts( repositorySystemSession, requests - ).toFiles().asSuccess() + ) } + } catch (resolutionException: ArtifactResolutionException) { + if (isOptional) { + resolutionException.results + } else { + return makeResolveFailureResult(listOf(resolutionException.message.orEmpty()), null, resolutionException) + } + } - ResolutionKind.TRANSITIVE_PARTIAL -> resolveDependencies(requests) { - val reports = mutableListOf() - val results = mutableListOf() - for (req in requests) { - try { - results.add( - repositorySystem.resolveArtifact( - repositorySystemSession, - req - ).artifact.file - ) - } catch (e: ArtifactResolutionException) { - reports.add( + return IterableResultsCollector().run { + for (artifactResult in artifactResults) { + if (artifactResult.isResolved) { + addValue(artifactResult.artifact.file) + } else { + for (exception in artifactResult.exceptions) { + addDiagnostic( ScriptDiagnostic( ScriptDiagnostic.unspecifiedError, - e.message.orEmpty(), - ScriptDiagnostic.Severity.WARNING, - exception = e + "Unable to resolve artifact ${artifactResult.request.artifact}", + exception = exception ) ) } } - - ResultWithDiagnostics.Success(results, reports) - } - - ResolutionKind.NON_TRANSITIVE -> { - error("This statement is not reachable") } + getResult() } } private fun resolveTree( roots: List, scope: String, + isOptional: Boolean, filter: DependencyFilter?, classifier: String?, extension: String?, ): Collection { return fetch( - request(roots.map { root -> Dependency(root, scope) }), + request(roots.map { root -> Dependency(root, scope, isOptional) }), { req -> val requestsBuilder = ArtifactRequestBuilder(classifier, extension) val collectionResult = repositorySystem.collectDependencies(repositorySystemSession, req) @@ -231,22 +229,6 @@ internal class AetherResolveSession( private fun Collection.toFiles() = map { it.artifact.file } - private fun resolveDependencies( - requests: Collection, - resolveAction: (Collection) -> ResultWithDiagnostics> - ): ResultWithDiagnostics> { - return fetch( - requests, - resolveAction - ) { _, ex -> - DependencyCollectionException( - null, - ex.message, - ex - ) - } - } - private fun resolveArtifacts(artifacts: List): List { val requests = artifacts.map { artifact -> ArtifactRequest(artifact, remotes, "") @@ -300,4 +282,4 @@ internal class AetherResolveSession( private val settings: Settings by lazy { createMavenSettings() } -} \ No newline at end of file +}