From 6eac5e1907f12a90267e5c7b9983db0007d57da2 Mon Sep 17 00:00:00 2001 From: Alexander Likhachev Date: Fri, 22 Jan 2021 14:27:21 +0300 Subject: [PATCH] [Gradle, JS] Tasks that uses ArchiveOperations compatible w/ Gradle < 6.6 --- .../kotlin/gradle/DukatIntegrationIT.kt | 3 +++ .../kotlin/gradle/Kotlin2JsGradlePluginIT.kt | 3 +++ .../gradle/KotlinJsLibraryGradlePluginIT.kt | 3 +++ .../kotlin/gradle/tasks/CleanDataTaskIT.kt | 2 +- .../targets/js/nodejs/NodeJsSetupTask.kt | 21 ++++++++++++++++--- .../targets/js/npm/GradleNodeModuleBuilder.kt | 19 ++++++++++++----- .../targets/js/npm/GradleNodeModulesCache.kt | 14 ++++++++++--- 7 files changed, 53 insertions(+), 12 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/DukatIntegrationIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/DukatIntegrationIT.kt index 5e2e9fbdca2..59a2b9a47c4 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/DukatIntegrationIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/DukatIntegrationIT.kt @@ -12,6 +12,9 @@ import org.junit.Test import kotlin.test.assertTrue class DukatIntegrationIT : BaseGradleIT() { + override val defaultGradleVersion: GradleVersionRequired + get() = GradleVersionRequired.AtLeast("6.0") + @Test fun testSeparateDukatKotlinDslRootDependencies() { testSeparateDukat( diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt index 50b73a400da..5512c45d39b 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt @@ -305,6 +305,9 @@ abstract class AbstractKotlin2JsGradlePluginIT(val irBackend: Boolean) : BaseGra jsCompilerType = if (irBackend) KotlinJsCompilerType.IR else KotlinJsCompilerType.LEGACY ) + override val defaultGradleVersion: GradleVersionRequired + get() = GradleVersionRequired.AtLeast("6.0") + protected fun CompiledProject.checkIrCompilationMessage() { if (irBackend) { assertContains(USING_JS_IR_BACKEND_MESSAGE) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinJsLibraryGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinJsLibraryGradlePluginIT.kt index 1c79a8937ea..73bde5e1908 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinJsLibraryGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinJsLibraryGradlePluginIT.kt @@ -16,6 +16,9 @@ class KotlinJsIrLibraryGradlePluginIT : BaseGradleIT() { jsCompilerType = KotlinJsCompilerType.IR ) + override val defaultGradleVersion: GradleVersionRequired + get() = GradleVersionRequired.AtLeast("6.0") + @Test fun testSimpleJsBinaryLibrary() { val project = Project("simple-js-library") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/tasks/CleanDataTaskIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/tasks/CleanDataTaskIT.kt index cf6b7805d3b..05af6fc01d7 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/tasks/CleanDataTaskIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/tasks/CleanDataTaskIT.kt @@ -14,7 +14,7 @@ import org.junit.Test class CleanDataTaskIT : BaseGradleIT() { override val defaultGradleVersion: GradleVersionRequired - get() = GradleVersionRequired.AtLeast("5.5.1") + get() = GradleVersionRequired.AtLeast("6.0") @Test fun testDownloadedFolderDeletion() { 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 ad30d9578df..df84e6c418b 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 @@ -17,7 +17,12 @@ open class NodeJsSetupTask : DefaultTask() { private val settings = NodeJsRootPlugin.apply(project.rootProject) private val env by lazy { settings.requireConfigured() } private val fs = services.get(FileSystemOperations::class.java) - private val archives = services.get(ArchiveOperations::class.java) + private val archives: Any? = try { + services.get(ArchiveOperations::class.java) + } catch (e: NoClassDefFoundError) { + // Gradle version < 6.6 + null + } val ivyDependency: String @Input get() = env.ivyDependency @@ -84,12 +89,22 @@ open class NodeJsSetupTask : DefaultTask() { when { archive.name.endsWith("zip") -> fs.copy { - it.from(archives.zipTree(archive)) + val from = if (archives != null) { + (archives as ArchiveOperations).zipTree(archive) + } else { + project.zipTree(archive) + } + it.from(from) it.into(destination) } else -> { fs.copy { - it.from(archives.tarTree(archive)) + val from = if (archives != null) { + (archives as ArchiveOperations).tarTree(archive) + } else { + project.tarTree(archive) + } + it.from(from) it.into(destination) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt index 14fac9f9a86..0b22455f22b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.gradle.targets.js.npm +import org.gradle.api.Project import org.gradle.api.file.ArchiveOperations import org.gradle.api.file.FileSystemOperations import org.jetbrains.kotlin.gradle.targets.js.JS @@ -17,8 +18,9 @@ import java.io.File * Creates fake NodeJS module directory from given gradle [dependency]. */ internal class GradleNodeModuleBuilder( + val project: Project, val fs: FileSystemOperations, - val archiveOperations: ArchiveOperations, + val archiveOperations: Any?, val moduleName: String, val moduleVersion: String, val srcFiles: Collection, @@ -31,10 +33,17 @@ internal class GradleNodeModuleBuilder( srcFiles.forEach { srcFile -> when { isKotlinJsRuntimeFile(srcFile) -> files.add(srcFile) - srcFile.isCompatibleArchive -> archiveOperations.zipTree(srcFile).forEach { innerFile -> - when { - innerFile.name == NpmProject.PACKAGE_JSON -> srcPackageJsonFile = innerFile - isKotlinJsRuntimeFile(innerFile) -> files.add(innerFile) + srcFile.isCompatibleArchive -> { + val archiveFiles = if (archiveOperations != null) { + (archiveOperations as ArchiveOperations).zipTree(srcFile) + } else { + project.zipTree(srcFile) + } + archiveFiles.forEach { innerFile -> + when { + innerFile.name == NpmProject.PACKAGE_JSON -> srcPackageJsonFile = innerFile + isKotlinJsRuntimeFile(innerFile) -> files.add(innerFile) + } } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModulesCache.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModulesCache.kt index 9f350db323f..935dd970fef 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModulesCache.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModulesCache.kt @@ -15,15 +15,23 @@ import java.io.File * Cache for storing already created [GradleNodeModule]s */ internal class GradleNodeModulesCache(nodeJs: NodeJsRootExtension) : AbstractNodeModulesCache(nodeJs) { - private val fs = (nodeJs.rootProject as ProjectInternal).services.get(FileSystemOperations::class.java) - private val archiveOperations = (nodeJs.rootProject as ProjectInternal).services.get(ArchiveOperations::class.java) + @Transient + private val project = nodeJs.rootProject + + private val fs = (project as ProjectInternal).services.get(FileSystemOperations::class.java) + private val archiveOperations: Any? = try { + (project as ProjectInternal).services.get(ArchiveOperations::class.java) + } catch (e: NoClassDefFoundError) { + // Gradle version < 6.6 + null + } override fun buildImportedPackage( name: String, version: String, file: File ): File? { - val module = GradleNodeModuleBuilder(fs, archiveOperations, name, version, listOf(file), dir) + val module = GradleNodeModuleBuilder(project, fs, archiveOperations, name, version, listOf(file), dir) module.visitArtifacts() return module.rebuild() }