diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt index e34bb622e47..fe1b4f196cd 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt @@ -1303,6 +1303,8 @@ class NewMultiplatformIT : BaseGradleIT() { build("tasks") { assertSuccessful() assertTrue(output.contains("Kotlin/Native distribution: ")) + // Check for KT-30258. + assertFalse(output.contains("Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.")) } build("tasks", "-Pkotlin.native.restrictedDistribution=true") { @@ -1348,6 +1350,17 @@ class NewMultiplatformIT : BaseGradleIT() { assertContains("Project property 'org.jetbrains.kotlin.native.version' is deprecated") } } + + // Gradle 5.0 introduced a new API for Ivy repository layouts. + // MPP plugin uses this API to download K/N if Gradle version is >= 5.0. + // Check this too (see KT-30258). + with(Project("new-mpp-native-libraries", GradleVersionRequired.AtLeast("5.0"))) { + build("tasks", "-Pkotlin.native.version=1.3.50-eap-11606") { + assertSuccessful() + assertTrue(output.contains("Kotlin/Native distribution: ")) + assertFalse(output.contains("Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.")) + } + } } @Test diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsSetupTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsSetupTask.kt index 0e57841b797..672f4bfb494 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsSetupTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsSetupTask.kt @@ -7,6 +7,7 @@ import org.gradle.api.tasks.OutputDirectory import org.gradle.api.tasks.TaskAction import org.jetbrains.kotlin.gradle.logging.kotlinInfo import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast +import org.jetbrains.kotlin.gradle.utils.patternLayoutCompatible import java.io.File import java.net.URI @@ -35,14 +36,9 @@ open class NodeJsSetupTask : DefaultTask() { repo.name = "Node Distributions at ${settings.nodeDownloadBaseUrl}" repo.url = URI(settings.nodeDownloadBaseUrl) - if (isGradleVersionAtLeast(5, 0)) { - repo.patternLayout { layout -> - configureNodeJsIvyPatternLayout(layout) - } - } else { - repo.layout("pattern") { layout -> - configureNodeJsIvyPatternLayout(layout as IvyPatternRepositoryLayout) - } + repo.patternLayoutCompatible { + artifact("v[revision]/[artifact](-v[revision]-[classifier]).[ext]") + ivy("v[revision]/ivy.xml") } repo.metadataSources { it.artifact() } @@ -66,11 +62,6 @@ open class NodeJsSetupTask : DefaultTask() { } } - private fun configureNodeJsIvyPatternLayout(layout: IvyPatternRepositoryLayout) { - layout.artifact("v[revision]/[artifact](-v[revision]-[classifier]).[ext]") - layout.ivy("v[revision]/ivy.xml") - } - private fun unpackNodeArchive(archive: File, destination: File) { project.logger.kotlinInfo("Unpacking $archive to $destination") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeCompilerDownloader.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeCompilerDownloader.kt index 937d4084d62..89395cb0dfa 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeCompilerDownloader.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeCompilerDownloader.kt @@ -6,8 +6,10 @@ @file:Suppress("PackageDirectoryMismatch") // Old package for compatibility package org.jetbrains.kotlin.gradle.utils +import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.artifacts.repositories.ArtifactRepository +import org.gradle.api.artifacts.repositories.IvyArtifactRepository import org.gradle.api.artifacts.repositories.IvyPatternRepositoryLayout import org.gradle.api.file.FileTree import org.gradle.api.logging.Logger @@ -80,9 +82,8 @@ class NativeCompilerDownloader( private fun setupRepo(repoUrl: String): ArtifactRepository { return project.repositories.ivy { repo -> repo.setUrl(repoUrl) - repo.layout("pattern") { - val layout = it as IvyPatternRepositoryLayout - layout.artifact("[artifact]-[revision].[ext]") + repo.patternLayoutCompatible { + artifact("[artifact]-[revision].[ext]") } repo.metadataSources { it.artifact() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/compatibiltiy.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/compatibiltiy.kt index 17d92111ebb..3ae63c17e59 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/compatibiltiy.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/compatibiltiy.kt @@ -16,8 +16,11 @@ package org.jetbrains.kotlin.gradle.utils +import org.gradle.api.Action import org.gradle.api.GradleException import org.gradle.api.Task +import org.gradle.api.artifacts.repositories.IvyArtifactRepository +import org.gradle.api.artifacts.repositories.IvyPatternRepositoryLayout import org.gradle.api.tasks.TaskInputs import org.gradle.api.tasks.TaskOutputs import org.gradle.api.tasks.bundling.AbstractArchiveTask @@ -73,4 +76,15 @@ internal fun AbstractArchiveTask.setArchiveClassifierCompatible(classifierProvid @Suppress("DEPRECATION") classifier = classifierProvider() } +} + +internal fun IvyArtifactRepository.patternLayoutCompatible(config: IvyPatternRepositoryLayout.() -> Unit) { + if (isGradleVersionAtLeast(5, 0)) { + patternLayout(config) + } else { + // The "layout" method is planned to be removed in Gradle 6.0. Access it using reflection. + javaClass + .getMethod("layout", String::class.java, Action::class.java) + .invoke(this, "pattern", Action { it.config() }) + } } \ No newline at end of file