From c7421e2bea2e87f15c684196fa4eaa7ac58e0221 Mon Sep 17 00:00:00 2001 From: Alexander Likhachev Date: Wed, 27 Jan 2021 08:42:54 +0300 Subject: [PATCH] [Gradle, JS] Use FileSystemOperations only when it's available FileSystemOperations is available since Gradle 6.0. ArchiveOperations usage is also refactored. Integration tests Gradle version requirements are reverted. --- .../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 | 27 +++-------- .../targets/js/npm/GradleNodeModuleBuilder.kt | 16 ++----- .../targets/js/npm/GradleNodeModulesCache.kt | 16 ++----- .../kotlin/gradle/utils/compatibiltiy.kt | 48 ++++++++++++++++++- 8 files changed, 64 insertions(+), 54 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 59a2b9a47c4..5e2e9fbdca2 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,9 +12,6 @@ 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 5512c45d39b..50b73a400da 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,9 +305,6 @@ 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 73bde5e1908..1c79a8937ea 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,9 +16,6 @@ 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 05af6fc01d7..cf6b7805d3b 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("6.0") + get() = GradleVersionRequired.AtLeast("5.5.1") @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 df84e6c418b..dfef4441c04 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 @@ -2,12 +2,12 @@ package org.jetbrains.kotlin.gradle.targets.js.nodejs import org.gradle.api.DefaultTask import org.gradle.api.artifacts.Configuration -import org.gradle.api.file.ArchiveOperations -import org.gradle.api.file.FileSystemOperations import org.gradle.api.provider.Provider import org.gradle.api.tasks.* import org.jetbrains.kotlin.gradle.logging.kotlinInfo import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService +import org.jetbrains.kotlin.gradle.utils.ArchiveOperationsCompat +import org.jetbrains.kotlin.gradle.utils.FileSystemOperationsCompat import org.jetbrains.kotlin.statistics.metrics.NumericalMetrics import java.io.File import java.net.URI @@ -16,13 +16,8 @@ import java.net.URI 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: Any? = try { - services.get(ArchiveOperations::class.java) - } catch (e: NoClassDefFoundError) { - // Gradle version < 6.6 - null - } + private val fs = FileSystemOperationsCompat(project) + private val archiveOperations = ArchiveOperationsCompat(project) val ivyDependency: String @Input get() = env.ivyDependency @@ -89,22 +84,12 @@ open class NodeJsSetupTask : DefaultTask() { when { archive.name.endsWith("zip") -> fs.copy { - val from = if (archives != null) { - (archives as ArchiveOperations).zipTree(archive) - } else { - project.zipTree(archive) - } - it.from(from) + it.from(archiveOperations.zipTree(archive)) it.into(destination) } else -> { fs.copy { - val from = if (archives != null) { - (archives as ArchiveOperations).tarTree(archive) - } else { - project.tarTree(archive) - } - it.from(from) + it.from(archiveOperations.tarTree(archive)) 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 0b22455f22b..2f7d458f9c7 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 @@ -6,21 +6,20 @@ 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 import org.jetbrains.kotlin.gradle.targets.js.JS_MAP import org.jetbrains.kotlin.gradle.targets.js.META_JS import org.jetbrains.kotlin.gradle.targets.js.ir.KLIB_TYPE +import org.jetbrains.kotlin.gradle.utils.ArchiveOperationsCompat +import org.jetbrains.kotlin.gradle.utils.FileSystemOperationsCompat import java.io.File /** * Creates fake NodeJS module directory from given gradle [dependency]. */ internal class GradleNodeModuleBuilder( - val project: Project, - val fs: FileSystemOperations, - val archiveOperations: Any?, + val fs: FileSystemOperationsCompat, + val archiveOperations: ArchiveOperationsCompat, val moduleName: String, val moduleVersion: String, val srcFiles: Collection, @@ -34,12 +33,7 @@ internal class GradleNodeModuleBuilder( when { isKotlinJsRuntimeFile(srcFile) -> files.add(srcFile) srcFile.isCompatibleArchive -> { - val archiveFiles = if (archiveOperations != null) { - (archiveOperations as ArchiveOperations).zipTree(srcFile) - } else { - project.zipTree(srcFile) - } - archiveFiles.forEach { innerFile -> + archiveOperations.zipTree(srcFile).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 935dd970fef..4ff5713ac95 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 @@ -5,10 +5,9 @@ package org.jetbrains.kotlin.gradle.targets.js.npm -import org.gradle.api.file.ArchiveOperations -import org.gradle.api.file.FileSystemOperations -import org.gradle.api.internal.project.ProjectInternal import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension +import org.jetbrains.kotlin.gradle.utils.ArchiveOperationsCompat +import org.jetbrains.kotlin.gradle.utils.FileSystemOperationsCompat import java.io.File /** @@ -18,20 +17,15 @@ internal class GradleNodeModulesCache(nodeJs: NodeJsRootExtension) : AbstractNod @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 - } + private val fs = FileSystemOperationsCompat(project) + private val archiveOperations = ArchiveOperationsCompat(project) override fun buildImportedPackage( name: String, version: String, file: File ): File? { - val module = GradleNodeModuleBuilder(project, fs, archiveOperations, name, version, listOf(file), dir) + val module = GradleNodeModuleBuilder(fs, archiveOperations, name, version, listOf(file), dir) module.visitArtifacts() return module.rebuild() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/compatibiltiy.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/compatibiltiy.kt index 271611db2a4..e5c3b7c8a5a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/compatibiltiy.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/compatibiltiy.kt @@ -17,9 +17,16 @@ package org.jetbrains.kotlin.gradle.utils import org.gradle.api.GradleException +import org.gradle.api.Project import org.gradle.api.Task +import org.gradle.api.file.ArchiveOperations +import org.gradle.api.file.CopySpec +import org.gradle.api.file.FileSystemOperations +import org.gradle.api.file.FileTree +import org.gradle.api.internal.project.ProjectInternal import org.gradle.api.tasks.TaskInputs import org.gradle.api.tasks.TaskOutputs +import org.gradle.api.tasks.WorkResult import org.gradle.api.tasks.bundling.AbstractArchiveTask import org.gradle.util.GradleVersion import java.io.File @@ -64,4 +71,43 @@ internal fun checkGradleCompatibility( } internal val AbstractArchiveTask.archivePathCompatible: File - get() = archiveFile.get().asFile \ No newline at end of file + get() = archiveFile.get().asFile + +internal class ArchiveOperationsCompat(@Transient private val project: Project) { + private val archiveOperations: Any? = try { + (project as ProjectInternal).services.get(ArchiveOperations::class.java) + } catch (e: NoClassDefFoundError) { + // Gradle version < 6.6 + null + } + + fun zipTree(obj: Any): FileTree { + return when (archiveOperations) { + is ArchiveOperations -> archiveOperations.zipTree(obj) + else -> project.zipTree(obj) + } + } + + fun tarTree(obj: Any): FileTree { + return when (archiveOperations) { + is ArchiveOperations -> archiveOperations.tarTree(obj) + else -> project.tarTree(obj) + } + } +} + +internal class FileSystemOperationsCompat(@Transient private val project: Project) { + private val fileSystemOperations: Any? = try { + (project as ProjectInternal).services.get(FileSystemOperations::class.java) + } catch (e: NoClassDefFoundError) { + // Gradle version < 6.0 + null + } + + fun copy(action: (CopySpec) -> Unit): WorkResult? { + return when (fileSystemOperations) { + is FileSystemOperations -> fileSystemOperations.copy(action) + else -> project.copy(action) + } + } +} \ No newline at end of file -- GitLab