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.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<List<File>> {
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<ScriptDiagnostic>()
val results = mutableListOf<File>()
for (req in requests) {
try {
results.add(
repositorySystem.resolveArtifact(
repositorySystemSession,
req
).artifact.file
)
} catch (e: ArtifactResolutionException) {
reports.add(
return IterableResultsCollector<File>().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<Artifact>,
scope: String,
isOptional: Boolean,
filter: DependencyFilter?,
classifier: String?,
extension: String?,
): Collection<ArtifactRequest> {
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<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> {
val requests = artifacts.map { artifact ->
ArtifactRequest(artifact, remotes, "")
@@ -300,4 +282,4 @@ internal class AetherResolveSession(
private val settings: Settings by lazy {
createMavenSettings()
}
}
}