Scripting: Unify artifacts resolution for partial and non-partial cases

This commit is contained in:
Ilya Muradyan
2023-09-14 11:36:14 +02:00
committed by Space Team
parent 841cc8eb43
commit b1347d7616
@@ -39,9 +39,11 @@ import org.eclipse.aether.util.repository.AuthenticationBuilder
import org.eclipse.aether.util.repository.DefaultMirrorSelector import org.eclipse.aether.util.repository.DefaultMirrorSelector
import org.eclipse.aether.util.repository.DefaultProxySelector import org.eclipse.aether.util.repository.DefaultProxySelector
import java.io.File import java.io.File
import kotlin.script.experimental.api.IterableResultsCollector
import kotlin.script.experimental.api.ResultWithDiagnostics import kotlin.script.experimental.api.ResultWithDiagnostics
import kotlin.script.experimental.api.ScriptDiagnostic import kotlin.script.experimental.api.ScriptDiagnostic
import kotlin.script.experimental.api.asSuccess 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() val mavenCentral: RemoteRepository = RemoteRepository.Builder("maven central", "default", "https://repo.maven.apache.org/maven2/").build()
@@ -153,58 +155,54 @@ internal class AetherResolveSession(
): ResultWithDiagnostics<List<File>> { ): ResultWithDiagnostics<List<File>> {
if (kind == ResolutionKind.NON_TRANSITIVE) return resolveArtifacts(roots).asSuccess() 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") val artifactResults = try {
return when (kind) { synchronized(this) {
ResolutionKind.TRANSITIVE -> resolveDependencies(requests) {
repositorySystem.resolveArtifacts( repositorySystem.resolveArtifacts(
repositorySystemSession, repositorySystemSession,
requests requests
).toFiles().asSuccess() )
} }
} catch (resolutionException: ArtifactResolutionException) {
if (isOptional) {
resolutionException.results
} else {
return makeResolveFailureResult(listOf(resolutionException.message.orEmpty()), null, resolutionException)
}
}
ResolutionKind.TRANSITIVE_PARTIAL -> resolveDependencies(requests) { return IterableResultsCollector<File>().run {
val reports = mutableListOf<ScriptDiagnostic>() for (artifactResult in artifactResults) {
val results = mutableListOf<File>() if (artifactResult.isResolved) {
for (req in requests) { addValue(artifactResult.artifact.file)
try { } else {
results.add( for (exception in artifactResult.exceptions) {
repositorySystem.resolveArtifact( addDiagnostic(
repositorySystemSession,
req
).artifact.file
)
} catch (e: ArtifactResolutionException) {
reports.add(
ScriptDiagnostic( ScriptDiagnostic(
ScriptDiagnostic.unspecifiedError, ScriptDiagnostic.unspecifiedError,
e.message.orEmpty(), "Unable to resolve artifact ${artifactResult.request.artifact}",
ScriptDiagnostic.Severity.WARNING, exception = exception
exception = e
) )
) )
} }
} }
ResultWithDiagnostics.Success(results, reports)
}
ResolutionKind.NON_TRANSITIVE -> {
error("This statement is not reachable")
} }
getResult()
} }
} }
private fun resolveTree( private fun resolveTree(
roots: List<Artifact>, roots: List<Artifact>,
scope: String, scope: String,
isOptional: Boolean,
filter: DependencyFilter?, filter: DependencyFilter?,
classifier: String?, classifier: String?,
extension: String?, extension: String?,
): Collection<ArtifactRequest> { ): Collection<ArtifactRequest> {
return fetch( return fetch(
request(roots.map { root -> Dependency(root, scope) }), request(roots.map { root -> Dependency(root, scope, isOptional) }),
{ req -> { req ->
val requestsBuilder = ArtifactRequestBuilder(classifier, extension) val requestsBuilder = ArtifactRequestBuilder(classifier, extension)
val collectionResult = repositorySystem.collectDependencies(repositorySystemSession, req) val collectionResult = repositorySystem.collectDependencies(repositorySystemSession, req)
@@ -231,22 +229,6 @@ internal class AetherResolveSession(
private fun Collection<ArtifactResult>.toFiles() = map { it.artifact.file } private fun Collection<ArtifactResult>.toFiles() = map { it.artifact.file }
private fun resolveDependencies(
requests: Collection<ArtifactRequest>,
resolveAction: (Collection<ArtifactRequest>) -> ResultWithDiagnostics<List<File>>
): ResultWithDiagnostics<List<File>> {
return fetch(
requests,
resolveAction
) { _, ex ->
DependencyCollectionException(
null,
ex.message,
ex
)
}
}
private fun resolveArtifacts(artifacts: List<Artifact>): List<File> { private fun resolveArtifacts(artifacts: List<Artifact>): List<File> {
val requests = artifacts.map { artifact -> val requests = artifacts.map { artifact ->
ArtifactRequest(artifact, remotes, "") ArtifactRequest(artifact, remotes, "")