diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt index 260b202fab5..dcfe8213d5e 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt @@ -493,6 +493,13 @@ abstract class BaseGradleIT { return this } + fun CompiledProject.assertDoesNotContain(vararg notExpected: String, ignoreCase: Boolean = false): CompiledProject { + for (str in notExpected) { + assertFalse(output.contains(str.normalize(), ignoreCase), "Output should not contain '$str'") + } + return this + } + fun CompiledProject.assertContainsRegex(expected: Regex): CompiledProject { assertTrue(expected.containsMatchIn(output), "Output should contain pattern '$expected'") return this diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppFlagsMigrationIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppFlagsMigrationIT.kt index 00dd72b7bd0..8fd98719e19 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppFlagsMigrationIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppFlagsMigrationIT.kt @@ -20,6 +20,7 @@ internal class MppFlagsMigrationIT : BaseGradleIT() { var dependencyPropagationFlag: Boolean? = null, var expectedToPass: Boolean = true, var expectedPhraseInOutput: String? = null, + var notExpectedPhraseInOutput: String? = null, ) { constructor(configure: TestCase.() -> Unit) : this() { configure() @@ -32,6 +33,13 @@ internal class MppFlagsMigrationIT : BaseGradleIT() { companion object { @OptIn(ExperimentalStdlibApi::class) private val testCases = buildList { + add(TestCase { + hierarchiesByDefault = true + granularMetadataFlag = null + dependencyPropagationFlag = null + expectedToPass = true + notExpectedPhraseInOutput = "It is safe to remove the property." + }) add(TestCase { hierarchiesByDefault = true granularMetadataFlag = true @@ -100,6 +108,7 @@ internal class MppFlagsMigrationIT : BaseGradleIT() { Project("new-mpp-published").apply { setupWorkingDir() gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) + gradleProperties().delete() } } @@ -128,6 +137,7 @@ internal class MppFlagsMigrationIT : BaseGradleIT() { assertFailed() testCase.expectedPhraseInOutput?.let { assertContains(it, ignoreCase = true) } + testCase.notExpectedPhraseInOutput?.let { assertDoesNotContain(it, ignoreCase = true) } } } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/internal/hierarchicalStructureMigrationHandling.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/internal/hierarchicalStructureMigrationHandling.kt index 9cc02c2e5fb..cd8d5083d39 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/internal/hierarchicalStructureMigrationHandling.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/internal/hierarchicalStructureMigrationHandling.kt @@ -14,11 +14,13 @@ import org.jetbrains.kotlin.gradle.utils.SingleWarningPerBuild import org.jetbrains.kotlin.gradle.utils.getOrPut internal fun handleHierarchicalStructureFlagsMigration(project: Project) { - SingleActionPerProject.run(project.rootProject, "handleHierarchicalStructureFlagsMigration - rootProject") { - doHandleHierarchicalStructureFlagsMigration(project.rootProject) + if (project.rootProject === project) { + SingleActionPerProject.run(project.rootProject, "handleHierarchicalStructureFlagsMigration - rootProject") { + doHandleHierarchicalStructureFlagsMigration(project.rootProject) + } + } else { + doHandleHierarchicalStructureFlagsMigration(project) } - - doHandleHierarchicalStructureFlagsMigration(project) } private fun doHandleHierarchicalStructureFlagsMigration(project: Project) {