From 3edf3ce9311490c36756149c0a892aab0ef7fd72 Mon Sep 17 00:00:00 2001 From: Maria Sokolova Date: Tue, 27 Feb 2024 20:53:35 +0100 Subject: [PATCH 1/7] Look for atomicfu-gradle-plugin version not only in the rootProject buildscript, but in the buildscript of the current project as well. An example of the project: integration-testing/examples/multi-module-test Fixes #403 --- .../plugin/gradle/AtomicFUGradlePlugin.kt | 27 +++++++++++++++++-- .../producer/build.gradle.kts | 7 ----- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt b/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt index f2dcbc00..74f857c4 100644 --- a/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt +++ b/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt @@ -42,8 +42,27 @@ private const val MIN_SUPPORTED_KGP_VERSION = "1.7.0" open class AtomicFUGradlePlugin : Plugin { override fun apply(project: Project) = project.run { checkCompatibility() - val pluginVersion = rootProject.buildscript.configurations.findByName("classpath") - ?.allDependencies?.find { it.name == "atomicfu-gradle-plugin" }?.version + // Get the version of atomicfu-gradle-plugin applied to the project: + // first try to find it in the root buildscript, then in the buildscript of the current project. + // The error is thrown in case atomicfu-gradle-plugin is not applied. + val pluginVersion = rootProject.getAGPVersion() ?: this.getAGPVersion() + requireNotNull(pluginVersion) { "We were unable to find the version of `kotlinx-atomicfu` plugin applied to the project.\n" + + "Please ensure that `kotlinx-atomicfu` plugin is correctly applied.\n" + + "Below is an example of Kotlin DSL code that applies `kotlinx-atomicfu` plugin:\n" + + "```\n" + + "buildscript {\n" + + " repositories {\n" + + " mavenCentral()\n" + + " }\n" + + "\n" + + " dependencies {\n" + + " classpath(\"org.jetbrains.kotlinx:atomicfu-gradle-plugin:0.23.2\")\n" + + " }\n" + + "}\n" + + "\n" + + "apply(plugin = \"kotlinx-atomicfu\")\n" + + "```\n" + + "For further information, refer to the project's README: https://github.com/Kotlin/kotlinx-atomicfu/blob/master/README.md#apply-plugin"} extensions.add(EXTENSION_NAME, AtomicFUPluginExtension(pluginVersion)) applyAtomicfuCompilerPlugin() configureDependencies() @@ -51,6 +70,10 @@ open class AtomicFUGradlePlugin : Plugin { } } +private fun Project.getAGPVersion(): String? = + buildscript.configurations.findByName("classpath") + ?.allDependencies?.find { it.name == "atomicfu-gradle-plugin" }?.version + private fun Project.checkCompatibility() { val currentGradleVersion = GradleVersion.current() val kotlinVersion = getKotlinVersion() diff --git a/integration-testing/examples/multi-module-test/producer/build.gradle.kts b/integration-testing/examples/multi-module-test/producer/build.gradle.kts index 802080a7..4e0e044d 100644 --- a/integration-testing/examples/multi-module-test/producer/build.gradle.kts +++ b/integration-testing/examples/multi-module-test/producer/build.gradle.kts @@ -32,12 +32,5 @@ kotlin { languageVersion = "2.0" } } - - // This is necessary for now, due to the problem with dependency configuration, see #403 - val jvmMain by getting { - dependencies { - api("org.jetbrains.kotlinx:atomicfu:0.23.2") - } - } } } From cabefe440c2ee4593aa39c9535f104f842bcd98a Mon Sep 17 00:00:00 2001 From: Maria Sokolova Date: Wed, 28 Feb 2024 12:14:26 +0100 Subject: [PATCH 2/7] Rename the function (AGP -> AFU) --- .../kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt b/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt index 74f857c4..38d9a7f3 100644 --- a/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt +++ b/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt @@ -45,7 +45,7 @@ open class AtomicFUGradlePlugin : Plugin { // Get the version of atomicfu-gradle-plugin applied to the project: // first try to find it in the root buildscript, then in the buildscript of the current project. // The error is thrown in case atomicfu-gradle-plugin is not applied. - val pluginVersion = rootProject.getAGPVersion() ?: this.getAGPVersion() + val pluginVersion = rootProject.getAFUVersion() ?: this.getAFUVersion() requireNotNull(pluginVersion) { "We were unable to find the version of `kotlinx-atomicfu` plugin applied to the project.\n" + "Please ensure that `kotlinx-atomicfu` plugin is correctly applied.\n" + "Below is an example of Kotlin DSL code that applies `kotlinx-atomicfu` plugin:\n" + @@ -70,7 +70,7 @@ open class AtomicFUGradlePlugin : Plugin { } } -private fun Project.getAGPVersion(): String? = +private fun Project.getAFUVersion(): String? = buildscript.configurations.findByName("classpath") ?.allDependencies?.find { it.name == "atomicfu-gradle-plugin" }?.version From 06b3cc1bfa5949b6e23e1b373b105fb71576e0f6 Mon Sep 17 00:00:00 2001 From: Maria Sokolova Date: Wed, 28 Feb 2024 16:04:33 +0100 Subject: [PATCH 3/7] Get the version from the project classpath --- .../plugin/gradle/AtomicFUGradlePlugin.kt | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt b/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt index 38d9a7f3..908bb7d6 100644 --- a/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt +++ b/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt @@ -17,12 +17,12 @@ import org.gradle.util.* import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.dsl.KotlinCompile import org.jetbrains.kotlin.gradle.plugin.* -import java.io.* -import java.util.* import org.jetbrains.kotlin.gradle.targets.js.* import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlinx.atomicfu.gradle.* +import java.io.* +import java.util.* import javax.inject.Inject private const val EXTENSION_NAME = "atomicfu" @@ -42,27 +42,29 @@ private const val MIN_SUPPORTED_KGP_VERSION = "1.7.0" open class AtomicFUGradlePlugin : Plugin { override fun apply(project: Project) = project.run { checkCompatibility() - // Get the version of atomicfu-gradle-plugin applied to the project: - // first try to find it in the root buildscript, then in the buildscript of the current project. - // The error is thrown in case atomicfu-gradle-plugin is not applied. - val pluginVersion = rootProject.getAFUVersion() ?: this.getAFUVersion() - requireNotNull(pluginVersion) { "We were unable to find the version of `kotlinx-atomicfu` plugin applied to the project.\n" + - "Please ensure that `kotlinx-atomicfu` plugin is correctly applied.\n" + - "Below is an example of Kotlin DSL code that applies `kotlinx-atomicfu` plugin:\n" + - "```\n" + - "buildscript {\n" + - " repositories {\n" + - " mavenCentral()\n" + - " }\n" + - "\n" + - " dependencies {\n" + - " classpath(\"org.jetbrains.kotlinx:atomicfu-gradle-plugin:0.23.2\")\n" + - " }\n" + - "}\n" + - "\n" + - "apply(plugin = \"kotlinx-atomicfu\")\n" + - "```\n" + - "For further information, refer to the project's README: https://github.com/Kotlin/kotlinx-atomicfu/blob/master/README.md#apply-plugin"} + val classpath = project.buildscript.configurations.getByName("classpath") + val pluginVersion = classpath.resolvedConfiguration.resolvedArtifacts + .map { artifact -> artifact.moduleVersion.id } + .firstOrNull { id -> "org.jetbrains.kotlinx" == id.group && "atomicfu-gradle-plugin" == id.name }?.version + ?: error( + "We were unable to find the version of `kotlinx-atomicfu` plugin applied to the project.\n" + + "Please ensure that `kotlinx-atomicfu` plugin is correctly applied.\n" + + "Below is an example of Kotlin DSL code that applies `kotlinx-atomicfu` plugin:\n" + + "```\n" + + "buildscript {\n" + + " repositories {\n" + + " mavenCentral()\n" + + " }\n" + + "\n" + + " dependencies {\n" + + " classpath(\"org.jetbrains.kotlinx:atomicfu-gradle-plugin:0.23.2\")\n" + + " }\n" + + "}\n" + + "\n" + + "apply(plugin = \"kotlinx-atomicfu\")\n" + + "```\n" + + "For further information, refer to the project's README: https://github.com/Kotlin/kotlinx-atomicfu/blob/master/README.md#apply-plugin" + ) extensions.add(EXTENSION_NAME, AtomicFUPluginExtension(pluginVersion)) applyAtomicfuCompilerPlugin() configureDependencies() From 02233caf13dab22cb0b0040f503d2df90eaba1be Mon Sep 17 00:00:00 2001 From: Maria Sokolova Date: Wed, 28 Feb 2024 19:56:21 +0100 Subject: [PATCH 4/7] Store atomicfu version in atomicfu.properties at build time, and read it during plugin application --- atomicfu-gradle-plugin/build.gradle | 6 ++++ .../plugin/gradle/AtomicFUGradlePlugin.kt | 36 ++++++------------- .../src/main/resources/atomicfu.properties | 1 + 3 files changed, 17 insertions(+), 26 deletions(-) create mode 100644 atomicfu-gradle-plugin/src/main/resources/atomicfu.properties diff --git a/atomicfu-gradle-plugin/build.gradle b/atomicfu-gradle-plugin/build.gradle index fca7953c..3db72fc0 100644 --- a/atomicfu-gradle-plugin/build.gradle +++ b/atomicfu-gradle-plugin/build.gradle @@ -36,3 +36,9 @@ dependencies { } evaluationDependsOn(':atomicfu') + +processResources { + filesMatching("atomicfu.properties") { + expand(["atomicfuVersion": project.version]) + } +} diff --git a/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt b/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt index 908bb7d6..01243c4b 100644 --- a/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt +++ b/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt @@ -42,29 +42,9 @@ private const val MIN_SUPPORTED_KGP_VERSION = "1.7.0" open class AtomicFUGradlePlugin : Plugin { override fun apply(project: Project) = project.run { checkCompatibility() - val classpath = project.buildscript.configurations.getByName("classpath") - val pluginVersion = classpath.resolvedConfiguration.resolvedArtifacts - .map { artifact -> artifact.moduleVersion.id } - .firstOrNull { id -> "org.jetbrains.kotlinx" == id.group && "atomicfu-gradle-plugin" == id.name }?.version - ?: error( - "We were unable to find the version of `kotlinx-atomicfu` plugin applied to the project.\n" + - "Please ensure that `kotlinx-atomicfu` plugin is correctly applied.\n" + - "Below is an example of Kotlin DSL code that applies `kotlinx-atomicfu` plugin:\n" + - "```\n" + - "buildscript {\n" + - " repositories {\n" + - " mavenCentral()\n" + - " }\n" + - "\n" + - " dependencies {\n" + - " classpath(\"org.jetbrains.kotlinx:atomicfu-gradle-plugin:0.23.2\")\n" + - " }\n" + - "}\n" + - "\n" + - "apply(plugin = \"kotlinx-atomicfu\")\n" + - "```\n" + - "For further information, refer to the project's README: https://github.com/Kotlin/kotlinx-atomicfu/blob/master/README.md#apply-plugin" - ) + // atomicfu version is stored at build time in atomicfu.properties file + // located in atomicfu-gradle-plugin resources + val pluginVersion = loadPropertyFromResources("atomicfu.properties", "atomicfu.version") extensions.add(EXTENSION_NAME, AtomicFUPluginExtension(pluginVersion)) applyAtomicfuCompilerPlugin() configureDependencies() @@ -72,9 +52,13 @@ open class AtomicFUGradlePlugin : Plugin { } } -private fun Project.getAFUVersion(): String? = - buildscript.configurations.findByName("classpath") - ?.allDependencies?.find { it.name == "atomicfu-gradle-plugin" }?.version +fun loadPropertyFromResources(propFileName: String, property: String): String { + val props = Properties() + val inputStream = AtomicFUGradlePlugin::class.java.classLoader!!.getResourceAsStream(propFileName) + ?: throw FileNotFoundException("'$propFileName' file was not found in the classpath") + inputStream.use { props.load(it) } + return props[property] as String +} private fun Project.checkCompatibility() { val currentGradleVersion = GradleVersion.current() diff --git a/atomicfu-gradle-plugin/src/main/resources/atomicfu.properties b/atomicfu-gradle-plugin/src/main/resources/atomicfu.properties new file mode 100644 index 00000000..a70d3625 --- /dev/null +++ b/atomicfu-gradle-plugin/src/main/resources/atomicfu.properties @@ -0,0 +1 @@ +atomicfu.version=${atomicfuVersion} From ed7c8be2834a384dc88c4edf63e3e0345c143bb3 Mon Sep 17 00:00:00 2001 From: Maria Sokolova Date: Wed, 28 Feb 2024 20:27:21 +0100 Subject: [PATCH 5/7] fix: loadPropertyFromResources should be private --- .../kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt b/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt index 01243c4b..e0f93bed 100644 --- a/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt +++ b/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt @@ -52,7 +52,7 @@ open class AtomicFUGradlePlugin : Plugin { } } -fun loadPropertyFromResources(propFileName: String, property: String): String { +private fun loadPropertyFromResources(propFileName: String, property: String): String { val props = Properties() val inputStream = AtomicFUGradlePlugin::class.java.classLoader!!.getResourceAsStream(propFileName) ?: throw FileNotFoundException("'$propFileName' file was not found in the classpath") From 66a71df61a2b5d3fafdf7a53542c66706e5bb677 Mon Sep 17 00:00:00 2001 From: Maria Sokolova Date: Thu, 29 Feb 2024 11:59:33 +0100 Subject: [PATCH 6/7] Fixed error message for the case when atomicfu.properties file was not found. --- .../kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt b/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt index e0f93bed..7454e3c3 100644 --- a/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt +++ b/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt @@ -55,7 +55,9 @@ open class AtomicFUGradlePlugin : Plugin { private fun loadPropertyFromResources(propFileName: String, property: String): String { val props = Properties() val inputStream = AtomicFUGradlePlugin::class.java.classLoader!!.getResourceAsStream(propFileName) - ?: throw FileNotFoundException("'$propFileName' file was not found in the classpath") + ?: throw FileNotFoundException("You are applying `kotlinx-atomicfu` plugin of version 0.23.3 or newer, yet we were unable to determine the specific version of the plugin.\". \n" + + "Starting from version 0.23.3 of `kotlinx-atomicfu`, the plugin version is extracted from the `atomicfu.properties` file, which resides within the atomicfu-gradle-plugin-{version}.jar. \n" + + "However, this file couldn't be found. Please ensure that there are no atomicfu-gradle-plugin-{version}.jar with version older than 0.23.3 present on the classpath.\n" ) inputStream.use { props.load(it) } return props[property] as String } From 45c4e9ac5bba65f358392a4ddee8ddaddde2a145 Mon Sep 17 00:00:00 2001 From: Maria Sokolova Date: Thu, 29 Feb 2024 12:40:31 +0100 Subject: [PATCH 7/7] Submit the issue --- .../kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt b/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt index 7454e3c3..417fa2ea 100644 --- a/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt +++ b/atomicfu-gradle-plugin/src/main/kotlin/kotlinx/atomicfu/plugin/gradle/AtomicFUGradlePlugin.kt @@ -57,7 +57,8 @@ private fun loadPropertyFromResources(propFileName: String, property: String): S val inputStream = AtomicFUGradlePlugin::class.java.classLoader!!.getResourceAsStream(propFileName) ?: throw FileNotFoundException("You are applying `kotlinx-atomicfu` plugin of version 0.23.3 or newer, yet we were unable to determine the specific version of the plugin.\". \n" + "Starting from version 0.23.3 of `kotlinx-atomicfu`, the plugin version is extracted from the `atomicfu.properties` file, which resides within the atomicfu-gradle-plugin-{version}.jar. \n" + - "However, this file couldn't be found. Please ensure that there are no atomicfu-gradle-plugin-{version}.jar with version older than 0.23.3 present on the classpath.\n" ) + "However, this file couldn't be found. Please ensure that there are no atomicfu-gradle-plugin-{version}.jar with version older than 0.23.3 present on the classpath.\n" + + "If the problem is not resolved, please submit the issue: https://github.com/Kotlin/kotlinx-atomicfu/" ) inputStream.use { props.load(it) } return props[property] as String }