From 43a4b84b44b8a2ef9b90cd6644dd8f1aceb83100 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Tue, 25 Sep 2018 12:49:05 +0200 Subject: [PATCH] Make script resolving annotations repeatable, fix multiple repos usage Also avoid "unknown resolver central" errors on ivy resolving #KT-27050 fixed --- .../jetbrains/kotlin/script/util/annotations.kt | 4 ++++ .../kotlin/script/util/resolvers/ivy.kt | 16 +++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/util/annotations.kt b/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/util/annotations.kt index 94e82e291c7..d15a619ddb6 100644 --- a/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/util/annotations.kt +++ b/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/util/annotations.kt @@ -19,10 +19,14 @@ package org.jetbrains.kotlin.script.util // in case of flat or direct resolvers the value should be a direct path or file name of a jar respectively // in case of maven resolver the maven coordinates string is accepted (resolved with com.jcabi.aether library) @Target(AnnotationTarget.FILE) +@Repeatable +@Retention(AnnotationRetention.SOURCE) annotation class DependsOn(val value: String = "", val groupId: String = "", val artifactId: String = "", val version: String = "") // only flat directory repositories are supported now, so value should be a path to a directory with jars // TODO: support other types of repos @Target(AnnotationTarget.FILE) +@Repeatable +@Retention(AnnotationRetention.SOURCE) annotation class Repository(val value: String = "", val id: String = "", val url: String = "") diff --git a/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/util/resolvers/ivy.kt b/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/util/resolvers/ivy.kt index 43217c3afe9..956db3af8bc 100644 --- a/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/util/resolvers/ivy.kt +++ b/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/util/resolvers/ivy.kt @@ -13,6 +13,7 @@ import org.apache.ivy.core.module.id.ModuleRevisionId import org.apache.ivy.core.resolve.ResolveOptions import org.apache.ivy.core.settings.IvySettings import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorWriter +import org.apache.ivy.plugins.resolver.ChainResolver import org.apache.ivy.plugins.resolver.URLResolver import org.apache.ivy.util.DefaultMessageLogger import org.apache.ivy.util.Message @@ -43,7 +44,7 @@ class IvyResolver : Resolver { private fun resolveArtifact(artifactId: List): List { - if (ivyResolvers.isEmpty()) { + if (ivyResolvers.isEmpty() || ivyResolvers.none { it.name == "central" }) { ivyResolvers.add( URLResolver().apply { isM2compatible = true @@ -53,10 +54,15 @@ class IvyResolver : Resolver { ) } val ivySettings = IvySettings().apply { - for (resolver in ivyResolvers) { - addResolver(resolver) - } - setDefaultResolver(ivyResolvers.first().name) + val resolver = + if (ivyResolvers.size == 1) ivyResolvers.first() + else ChainResolver().also { + for (resolver in ivyResolvers) { + it.add(resolver) + } + } + addResolver(resolver) + setDefaultResolver(resolver.name) } val ivy = Ivy.newInstance(ivySettings)