From 276a6acc3e97d84ddfe916380a928535e86d2d07 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Mon, 18 Dec 2017 18:00:07 +0300 Subject: [PATCH] Use .withDependencies { ... } to set up default versions with Gradle 4.4 + Improve the test for omitted Kotlin module versions. Issues: #KT-21806 Fixed, #KT-21203 Fixed --- .../kotlin/gradle/KotlinGradlePluginIT.kt | 13 ++++++++++--- .../kotlin/gradle/plugin/KotlinPlugin.kt | 19 +++++++++++++++---- .../gradle/utils/ParsedGradleVersion.kt | 8 +++++++- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt index 2058f2ebdf0..f4327f455c8 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt @@ -457,15 +457,22 @@ class KotlinGradleIT: BaseGradleIT() { @Test fun testOmittedStdlibVersion() { - val project = Project("kotlinProject", "2.3") + val project = Project("kotlinProject", "4.4") project.setupWorkingDir() File(project.projectDir, "build.gradle").modify { - it.replace("kotlin-stdlib:\$kotlin_version", "kotlin-stdlib").apply { check(!equals(it)) } + it.replace("kotlin-stdlib:\$kotlin_version", "kotlin-stdlib").apply { check(!equals(it)) } + "\n" + """ + apply plugin: 'maven' + install.repositories { maven { url "file://${'$'}buildDir/repo" } } + """.trimIndent() } - project.build("build") { + project.build("build", "install") { assertSuccessful() assertContains(":compileKotlin", ":compileTestKotlin") + val pomLines = File(project.projectDir, "build/poms/pom-default.xml").readLines() + val stdlibVersionLineNumber = pomLines.indexOfFirst { "kotlin-stdlib" in it } + 1 + val versionLine = pomLines[stdlibVersionLineNumber] + assertTrue { "${defaultBuildOptions().kotlinVersion}" in versionLine } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index 838b9197771..df3f39da6c9 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -10,6 +10,7 @@ import com.intellij.util.ReflectionUtil import groovy.lang.Closure import org.gradle.api.* import org.gradle.api.artifacts.Configuration +import org.gradle.api.artifacts.ExternalDependency import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.FileCollection import org.gradle.api.file.SourceDirectorySet @@ -396,10 +397,20 @@ internal abstract class AbstractKotlinPlugin( private fun configureDefaultVersionsResolutionStrategy(project: Project) { project.configurations.all { configuration -> - configuration.resolutionStrategy.eachDependency { details -> - val requested = details.requested - if (requested.group == "org.jetbrains.kotlin" && requested.version.isEmpty()) { - details.useVersion(kotlinPluginVersion) + if (isGradleVersionAtLeast(4, 4)) { + // Use the API introduced in Gradle 4.4 to modify the dependencies directly before they are resolved: + configuration.withDependencies { dependencySet -> + dependencySet.filterIsInstance() + .filter { it.group == "org.jetbrains.kotlin" && it.version.isNullOrEmpty() } + .forEach { it.version { constraint -> constraint.prefer(kotlinPluginVersion) } } + } + } + else { + configuration.resolutionStrategy.eachDependency { details -> + val requested = details.requested + if (requested.group == "org.jetbrains.kotlin" && requested.version.isEmpty()) { + details.useVersion(kotlinPluginVersion) + } } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/ParsedGradleVersion.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/ParsedGradleVersion.kt index d8c077034a9..162e3076295 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/ParsedGradleVersion.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/ParsedGradleVersion.kt @@ -16,6 +16,8 @@ package org.jetbrains.kotlin.gradle.utils +import org.gradle.util.GradleVersion + internal data class ParsedGradleVersion(val major: Int, val minor: Int) : Comparable { override fun compareTo(other: ParsedGradleVersion): Int { val majorCompare = major.compareTo(other.major) @@ -51,4 +53,8 @@ internal data class ParsedGradleVersion(val major: Int, val minor: Int) : Compar return null } } -} \ No newline at end of file +} + +fun isGradleVersionAtLeast(major: Int, minor: Int) = + ParsedGradleVersion.parse(GradleVersion.current().version) + ?.let { it >= ParsedGradleVersion(major, minor) } ?: false \ No newline at end of file