Gradle: Don't use the deprecated "layout" method for Ivy repos

Issue #KT-30258 fixed
This commit is contained in:
Ilya Matveev
2019-08-02 17:42:13 +07:00
parent b8bdef0005
commit 499f9330d2
4 changed files with 35 additions and 16 deletions
@@ -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
@@ -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")
@@ -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()
@@ -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<IvyPatternRepositoryLayout> { it.config() })
}
}