From 6b5f9e2eef299a5b4e237c1aa87b92b2ba9668d9 Mon Sep 17 00:00:00 2001 From: Him188 <Him188@mamoe.net> Date: Sun, 1 May 2022 17:59:05 +0100 Subject: [PATCH] Change file suffix of new plugins to '.mirai2.jar'. Ignore '.mirai.jar' if its '.mirai2.jar' counterparts loaded. Close #1999 --- ...t.mamoe.mirai.console.plugin.jvm.JvmPlugin | 10 ++++++ .../src/After211NoNew.kt | 31 +++++++++++++++++ .../mirai-jar-after-2_11/build.gradle.kts | 31 +++++++++++++++++ ...t.mamoe.mirai.console.plugin.jvm.JvmPlugin | 10 ++++++ .../mirai-jar-after-2_11/src/After211.kt | 33 +++++++++++++++++++ .../mirai-jar-before-2_11/build.gradle.kts | 31 +++++++++++++++++ ...t.mamoe.mirai.console.plugin.jvm.JvmPlugin | 10 ++++++ .../mirai-jar-before-2_11/src/Before211.kt | 32 ++++++++++++++++++ .../compatibility-validation/jvm/api/jvm.api | 2 +- .../plugin/BuiltInJvmPluginLoaderImpl.kt | 23 ++++++++++++- .../src/plugin/loader/FilePluginLoader.kt | 6 ++-- .../plugin/BuiltInJvmPluginLoaderImplTest.kt | 16 +++++++++ .../src/integTest/kotlin/TestBuildPlugin.kt | 2 +- .../src/main/kotlin/BuildMiraiPluginV2.kt | 6 +++- .../main/kotlin/MiraiConsoleGradlePlugin.kt | 10 +++--- 15 files changed, 243 insertions(+), 10 deletions(-) create mode 100644 mirai-console/backend/integration-test/testers/mirai-jar-after-2_11-without-new/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin create mode 100644 mirai-console/backend/integration-test/testers/mirai-jar-after-2_11-without-new/src/After211NoNew.kt create mode 100644 mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/build.gradle.kts create mode 100644 mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin create mode 100644 mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/src/After211.kt create mode 100644 mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/build.gradle.kts create mode 100644 mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin create mode 100644 mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/src/Before211.kt create mode 100644 mirai-console/backend/mirai-console/test/plugin/BuiltInJvmPluginLoaderImplTest.kt diff --git a/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11-without-new/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11-without-new/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin new file mode 100644 index 000000000..ffb44fdc2 --- /dev/null +++ b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11-without-new/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin @@ -0,0 +1,10 @@ +# +# Copyright 2019-2022 Mamoe Technologies and contributors. +# +# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. +# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. +# +# https://github.com/mamoe/mirai/blob/dev/LICENSE +# + +mirai.jar.before211.nonew.After211NoNew \ No newline at end of file diff --git a/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11-without-new/src/After211NoNew.kt b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11-without-new/src/After211NoNew.kt new file mode 100644 index 000000000..e7c89ddf4 --- /dev/null +++ b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11-without-new/src/After211NoNew.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2019-2022 Mamoe Technologies and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/dev/LICENSE + */ + +package mirai.jar.before211.nonew + +import net.mamoe.mirai.console.plugin.PluginManager +import net.mamoe.mirai.console.plugin.id +import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription +import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin +import kotlin.test.assertTrue + +/* + * 2.11 及以后打包的插件, 无新插件替代 + */ +internal object After211NoNew : KotlinPlugin( + JvmPluginDescription( + id = "net.mamoe.tester.before211.nonew", + version = "1.0.0", + name = "Test Plugin", + ) +) { + override fun onEnable() { + assertTrue("net.mamoe.tester.after211 is not loaded") { PluginManager.plugins.any { it.id == "net.mamoe.tester.after211" } } + } +} diff --git a/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/build.gradle.kts b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/build.gradle.kts new file mode 100644 index 000000000..dca5a11c2 --- /dev/null +++ b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/build.gradle.kts @@ -0,0 +1,31 @@ +/* + * Copyright 2019-2022 Mamoe Technologies and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/dev/LICENSE + */ + +@file:Suppress("UnusedImport") + +plugins { + kotlin("jvm") + kotlin("plugin.serialization") + id("java") +} + +version = "0.0.0" + +kotlin { + explicitApiWarning() +} + +dependencies { + api(project(":mirai-console.integration-test")) +} + +tasks.getByName("jar", Jar::class) { + archiveBaseName.set("mirai-jar-compatibility-211") + archiveExtension.set("mirai2.jar") +} \ No newline at end of file diff --git a/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin new file mode 100644 index 000000000..b9b9578f6 --- /dev/null +++ b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin @@ -0,0 +1,10 @@ +# +# Copyright 2019-2022 Mamoe Technologies and contributors. +# +# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. +# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. +# +# https://github.com/mamoe/mirai/blob/dev/LICENSE +# + +mirai.jar.after211.After211 \ No newline at end of file diff --git a/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/src/After211.kt b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/src/After211.kt new file mode 100644 index 000000000..5773b3442 --- /dev/null +++ b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/src/After211.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2019-2022 Mamoe Technologies and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/dev/LICENSE + */ + +package mirai.jar.after211 + +import net.mamoe.mirai.console.plugin.PluginManager +import net.mamoe.mirai.console.plugin.id +import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription +import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin +import kotlin.test.assertFalse +import kotlin.test.assertTrue + +/* + * 2.11 及以后打包的插件, 有 net.mamoe.tester.after211 替代 + */ +internal object After211 : KotlinPlugin( + JvmPluginDescription( + id = "net.mamoe.tester.after211", + version = "1.0.0", + name = "Test Plugin", + ) +) { + override fun onEnable() { + assertFalse("net.mamoe.tester.before211 is loaded") { PluginManager.plugins.any { it.id == "net.mamoe.tester.before211" } } + assertTrue("net.mamoe.tester.before211.nonew is not loaded") { PluginManager.plugins.any { it.id == "net.mamoe.tester.before211.nonew" } } + } +} diff --git a/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/build.gradle.kts b/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/build.gradle.kts new file mode 100644 index 000000000..f25925ea5 --- /dev/null +++ b/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/build.gradle.kts @@ -0,0 +1,31 @@ +/* + * Copyright 2019-2022 Mamoe Technologies and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/dev/LICENSE + */ + +@file:Suppress("UnusedImport") + +plugins { + kotlin("jvm") + kotlin("plugin.serialization") + id("java") +} + +version = "0.0.0" + +kotlin { + explicitApiWarning() +} + +dependencies { + api(project(":mirai-console.integration-test")) +} + +tasks.getByName("jar", Jar::class) { + archiveBaseName.set("mirai-jar-compatibility-211") + archiveExtension.set("mirai.jar") +} \ No newline at end of file diff --git a/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin b/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin new file mode 100644 index 000000000..4dbd503d4 --- /dev/null +++ b/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin @@ -0,0 +1,10 @@ +# +# Copyright 2019-2022 Mamoe Technologies and contributors. +# +# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. +# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. +# +# https://github.com/mamoe/mirai/blob/dev/LICENSE +# + +mirai.jar.before211.Before211 \ No newline at end of file diff --git a/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/src/Before211.kt b/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/src/Before211.kt new file mode 100644 index 000000000..1b2b76d20 --- /dev/null +++ b/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/src/Before211.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2019-2022 Mamoe Technologies and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/dev/LICENSE + */ + +package mirai.jar.before211 + +import net.mamoe.mirai.console.plugin.PluginManager +import net.mamoe.mirai.console.plugin.id +import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription +import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin +import kotlin.test.assertFalse + +/* + * 2.11 以前打包的插件 + */ +internal object Before211 : KotlinPlugin( + JvmPluginDescription( + id = "net.mamoe.tester.before211", + version = "1.0.0", + name = "Test Plugin", + ) +) { + override fun onEnable() { + assertFalse("Both before211 and after211 are loaded.") { PluginManager.plugins.any { it.id == "net.mamoe.tester.after211" } } + throw AssertionError("Only net.mamoe.tester.before211 is loaded.") + } +} diff --git a/mirai-console/backend/mirai-console/compatibility-validation/jvm/api/jvm.api b/mirai-console/backend/mirai-console/compatibility-validation/jvm/api/jvm.api index d191b99d4..48948b450 100644 --- a/mirai-console/backend/mirai-console/compatibility-validation/jvm/api/jvm.api +++ b/mirai-console/backend/mirai-console/compatibility-validation/jvm/api/jvm.api @@ -2288,7 +2288,7 @@ public abstract class net/mamoe/mirai/console/plugin/loader/AbstractFilePluginLo public fun <init> (Ljava/lang/String;)V protected abstract fun extractPlugins (Lkotlin/sequences/Sequence;)Ljava/util/List; public fun getFileSuffix ()Ljava/lang/String; - public final fun listPlugins ()Ljava/util/List; + public fun listPlugins ()Ljava/util/List; } public abstract interface class net/mamoe/mirai/console/plugin/loader/FilePluginLoader : net/mamoe/mirai/console/plugin/loader/PluginLoader { diff --git a/mirai-console/backend/mirai-console/src/internal/plugin/BuiltInJvmPluginLoaderImpl.kt b/mirai-console/backend/mirai-console/src/internal/plugin/BuiltInJvmPluginLoaderImpl.kt index 7c7d02830..c49922eb1 100644 --- a/mirai-console/backend/mirai-console/src/internal/plugin/BuiltInJvmPluginLoaderImpl.kt +++ b/mirai-console/backend/mirai-console/src/internal/plugin/BuiltInJvmPluginLoaderImpl.kt @@ -25,7 +25,6 @@ import net.mamoe.mirai.console.plugin.loader.PluginLoadException import net.mamoe.mirai.console.plugin.name import net.mamoe.mirai.utils.* import java.io.File -import java.io.InputStream import java.nio.file.Path import java.util.concurrent.ConcurrentHashMap import kotlin.coroutines.CoroutineContext @@ -44,6 +43,28 @@ internal class BuiltInJvmPluginLoaderImpl( internal val logger: MiraiLogger = MiraiConsole.createLogger(JvmPluginLoader::class.simpleName!!) } + fun pluginsFilesSequence( + files: Sequence<File> = PluginManager.pluginsFolder.listFiles().orEmpty().asSequence() + ): Sequence<File> { + val raw = files + .filter { it.isFile && it.name.endsWith(fileSuffix, ignoreCase = true) } + .toMutableList() + + val mirai2List = raw.filter { it.name.endsWith(".mirai2.jar", ignoreCase = true) } + for (mirai2Plugin in mirai2List) { + val name = mirai2Plugin.name.substringBeforeLast('.').substringBeforeLast('.') // without ext. + raw.removeAll { + it !== mirai2Plugin && it.name.substringBeforeLast('.').substringBeforeLast('.') == name + } // remove those with .mirai.jar + } + + return raw.asSequence() + } + + override fun listPlugins(): List<JvmPlugin> { + return pluginsFilesSequence().extractPlugins() + } + override val configStorage: PluginDataStorage get() = MiraiConsoleImplementation.getInstance().configStorageForJvmPluginLoader diff --git a/mirai-console/backend/mirai-console/src/plugin/loader/FilePluginLoader.kt b/mirai-console/backend/mirai-console/src/plugin/loader/FilePluginLoader.kt index f9b96bad5..ca5ac9263 100644 --- a/mirai-console/backend/mirai-console/src/plugin/loader/FilePluginLoader.kt +++ b/mirai-console/backend/mirai-console/src/plugin/loader/FilePluginLoader.kt @@ -1,5 +1,5 @@ /* - * Copyright 2019-2021 Mamoe Technologies and contributors. + * Copyright 2019-2022 Mamoe Technologies and contributors. * * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. @@ -13,6 +13,7 @@ import net.mamoe.mirai.console.plugin.Plugin import net.mamoe.mirai.console.plugin.PluginManager import net.mamoe.mirai.console.plugin.description.PluginDescription import net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader +import net.mamoe.mirai.utils.NotStableForInheritance import java.io.File /** @@ -48,5 +49,6 @@ public abstract class AbstractFilePluginLoader<P : Plugin, D : PluginDescription */ protected abstract fun Sequence<File>.extractPlugins(): List<P> - public final override fun listPlugins(): List<P> = pluginsFilesSequence().extractPlugins() + @NotStableForInheritance // made non-final in 2.11 + public override fun listPlugins(): List<P> = pluginsFilesSequence().extractPlugins() } \ No newline at end of file diff --git a/mirai-console/backend/mirai-console/test/plugin/BuiltInJvmPluginLoaderImplTest.kt b/mirai-console/backend/mirai-console/test/plugin/BuiltInJvmPluginLoaderImplTest.kt new file mode 100644 index 000000000..ef3d131b1 --- /dev/null +++ b/mirai-console/backend/mirai-console/test/plugin/BuiltInJvmPluginLoaderImplTest.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2019-2022 Mamoe Technologies and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/dev/LICENSE + */ + +package net.mamoe.mirai.console.plugin + +import net.mamoe.mirai.console.testFramework.AbstractConsoleInstanceTest + +internal class BuiltInJvmPluginLoaderImplTest : AbstractConsoleInstanceTest() { + +} \ No newline at end of file diff --git a/mirai-console/tools/gradle-plugin/src/integTest/kotlin/TestBuildPlugin.kt b/mirai-console/tools/gradle-plugin/src/integTest/kotlin/TestBuildPlugin.kt index 139b273ff..f77482d4a 100644 --- a/mirai-console/tools/gradle-plugin/src/integTest/kotlin/TestBuildPlugin.kt +++ b/mirai-console/tools/gradle-plugin/src/integTest/kotlin/TestBuildPlugin.kt @@ -204,7 +204,7 @@ class TestBuildPlugin : AbstractTest() { } } - private fun findJar(): File = tempDir.resolve("build/mirai").listFiles()!!.first { it.name.endsWith(".mirai.jar") } + private fun findJar(): File = tempDir.resolve("build/mirai").listFiles()!!.first { it.name.endsWith(".mirai2.jar") } private fun checkOutput() { val jar = findJar() diff --git a/mirai-console/tools/gradle-plugin/src/main/kotlin/BuildMiraiPluginV2.kt b/mirai-console/tools/gradle-plugin/src/main/kotlin/BuildMiraiPluginV2.kt index caf1cc028..d0595e2e9 100644 --- a/mirai-console/tools/gradle-plugin/src/main/kotlin/BuildMiraiPluginV2.kt +++ b/mirai-console/tools/gradle-plugin/src/main/kotlin/BuildMiraiPluginV2.kt @@ -35,6 +35,9 @@ import javax.inject.Inject @Suppress("RedundantLambdaArrow", "RemoveExplicitTypeArguments") public open class BuildMiraiPluginV2 : Jar() { + public companion object { + public const val FILE_SUFFIX: String = "mirai2.jar" + } // @get:Internal private lateinit var metadataTask: GenMetadataTask @@ -243,7 +246,7 @@ public open class BuildMiraiPluginV2 : Jar() { internal fun init(target: KotlinTarget) { dependsOn(metadataTask) - archiveExtension.set("mirai.jar") + archiveExtension.set(FILE_SUFFIX) duplicatesStrategy = DuplicatesStrategy.WARN val compilations = target.compilations.filter { it.name == KotlinCompilation.MAIN_COMPILATION_NAME } @@ -256,4 +259,5 @@ public open class BuildMiraiPluginV2 : Jar() { elm.path.startsWith("META-INF/") && elm.name.endsWith(".sf", ignoreCase = true) } } + } \ No newline at end of file diff --git a/mirai-console/tools/gradle-plugin/src/main/kotlin/MiraiConsoleGradlePlugin.kt b/mirai-console/tools/gradle-plugin/src/main/kotlin/MiraiConsoleGradlePlugin.kt index 0664cfcd7..d8ad01a62 100644 --- a/mirai-console/tools/gradle-plugin/src/main/kotlin/MiraiConsoleGradlePlugin.kt +++ b/mirai-console/tools/gradle-plugin/src/main/kotlin/MiraiConsoleGradlePlugin.kt @@ -30,9 +30,11 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinTarget public class MiraiConsoleGradlePlugin : Plugin<Project> { - internal companion object { - const val MIRAI_SHADOW_CONF_NAME: String = "shadowLink" - const val MIRAI_AS_NORMAL_DEP_CONF_NAME: String = "asNormalDep" + public companion object { + internal const val MIRAI_SHADOW_CONF_NAME: String = "shadowLink" + internal const val MIRAI_AS_NORMAL_DEP_CONF_NAME: String = "asNormalDep" + + public const val FILE_SUFFIX: String = "mirai.jar" } private fun KotlinSourceSet.configureSourceSet(project: Project, target: KotlinTarget) { @@ -137,7 +139,7 @@ public class MiraiConsoleGradlePlugin : Plugin<Project> { ).apply shadow@{ group = "mirai" - archiveExtension.set("legacy.mirai.jar") + archiveExtension.set(FILE_SUFFIX) val compilations = target.compilations.filter { it.name == MAIN_COMPILATION_NAME }