diff --git a/src/main/kotlin/creator/custom/CustomPlatformStep.kt b/src/main/kotlin/creator/custom/CustomPlatformStep.kt index b4f3223a5..eb9752432 100644 --- a/src/main/kotlin/creator/custom/CustomPlatformStep.kt +++ b/src/main/kotlin/creator/custom/CustomPlatformStep.kt @@ -23,6 +23,7 @@ package com.demonwav.mcdev.creator.custom import com.demonwav.mcdev.MinecraftSettings import com.demonwav.mcdev.asset.MCDevBundle import com.demonwav.mcdev.creator.custom.providers.EmptyLoadedTemplate +import com.demonwav.mcdev.creator.custom.providers.InvalidVersionTemplate import com.demonwav.mcdev.creator.custom.providers.LoadedTemplate import com.demonwav.mcdev.creator.custom.providers.TemplateProvider import com.demonwav.mcdev.creator.modalityState @@ -95,6 +96,7 @@ class CustomPlatformStep( val templateLoadingText2Property = propertyGraph.property("") lateinit var templatePropertiesProcessIcon: Cell lateinit var noTemplatesAvailable: Cell + lateinit var invalidTemplateVersion: Cell var templateLoadingJob: Job? = null private val externalPropertyProvider = object : ExternalTemplatePropertyProvider { @@ -200,6 +202,9 @@ class CustomPlatformStep( noTemplatesAvailable = label(MCDevBundle("creator.step.generic.no_templates_available.message")) .visible(false) .apply { component.foreground = JBColor.RED } + invalidTemplateVersion = label("Invalid template version.") + .visible(false) + .apply { component.foreground = JBColor.RED } templatePropertyPlaceholder = placeholder().align(AlignX.FILL) }.topGap(TopGap.SMALL) @@ -265,8 +270,23 @@ class CustomPlatformStep( templateLoadingProperty.set(false) noTemplatesAvailable.visible(newTemplates.isEmpty()) - availableTemplates = newTemplates + if (newTemplates.any { checkInvalidVersionTemplate(it) }) { + availableTemplates = emptyList() + invalidTemplateVersion.visible(true) + } else { + availableTemplates = newTemplates + invalidTemplateVersion.visible(false) + } + } + } + + private fun checkInvalidVersionTemplate(template: LoadedTemplate): Boolean { + if (template is InvalidVersionTemplate) { + invalidTemplateVersion.component.text = "Invalid template version: ${template.descriptor.version}. Supported " + + "versions: [${TemplateDescriptor.SUPPORTED_FORMAT_VERSIONS.joinToString(", ")}]" + return true; } + return false } override fun setupProject(project: Project) { diff --git a/src/main/kotlin/creator/custom/TemplateDescriptor.kt b/src/main/kotlin/creator/custom/TemplateDescriptor.kt index 8f40dcbb3..aa1859dd4 100644 --- a/src/main/kotlin/creator/custom/TemplateDescriptor.kt +++ b/src/main/kotlin/creator/custom/TemplateDescriptor.kt @@ -40,7 +40,8 @@ data class TemplateDescriptor( companion object { - const val FORMAT_VERSION = 3 + val SUPPORTED_FORMAT_VERSIONS = intArrayOf(3, 2, 1) + val LATEST_FORMAT_VERSION = SUPPORTED_FORMAT_VERSIONS[0]; } } diff --git a/src/main/kotlin/creator/custom/providers/BuiltinTemplateProvider.kt b/src/main/kotlin/creator/custom/providers/BuiltinTemplateProvider.kt index 2144d4981..462cf139e 100644 --- a/src/main/kotlin/creator/custom/providers/BuiltinTemplateProvider.kt +++ b/src/main/kotlin/creator/custom/providers/BuiltinTemplateProvider.kt @@ -38,7 +38,6 @@ class BuiltinTemplateProvider : RemoteTemplateProvider() { private val builtinRepoUrl = $$"https://github.com/minecraft-dev/templates/archive/refs/heads/v$version.zip" private val builtinTemplatesPath = PluginUtil.plugin.pluginPath.resolve("lib/resources/builtin-templates") - private val builtinTemplatesInnerPath = "templates-${TemplateDescriptor.FORMAT_VERSION}" private var repoUpdated: Boolean = false override val label: String = MCDevBundle("template.provider.builtin.label") @@ -60,9 +59,11 @@ class BuiltinTemplateProvider : RemoteTemplateProvider() { context: WizardContext, repo: MinecraftSettings.TemplateRepo ): Collection { - val remoteTemplates = doLoadTemplates(context, repo, builtinTemplatesInnerPath) - if (remoteTemplates.isNotEmpty()) { - return remoteTemplates + for (supportedVersion in TemplateDescriptor.SUPPORTED_FORMAT_VERSIONS) { + val remoteTemplates = doLoadTemplates(context, repo, "templates-${supportedVersion}", supportedVersion) + if (remoteTemplates.isNotEmpty()) { + return remoteTemplates + } } val repoRoot = builtinTemplatesPath.virtualFile diff --git a/src/main/kotlin/creator/custom/providers/InvalidVersionTemplate.kt b/src/main/kotlin/creator/custom/providers/InvalidVersionTemplate.kt new file mode 100644 index 000000000..76fd26f72 --- /dev/null +++ b/src/main/kotlin/creator/custom/providers/InvalidVersionTemplate.kt @@ -0,0 +1,21 @@ +package com.demonwav.mcdev.creator.custom.providers + +import com.demonwav.mcdev.creator.custom.TemplateDescriptor +import com.intellij.openapi.vfs.VirtualFile + +class InvalidVersionTemplate( + templateRoot: VirtualFile, + label: String, + descriptor: TemplateDescriptor, + tooltip: String? = null +) : VfsLoadedTemplate( + templateRoot, + label, + tooltip, + descriptor, + false +) { + override fun loadTemplateContents(path: String): String { + throw NotImplementedError("You cannot load template contents of a template with an invalid version.") + } +} diff --git a/src/main/kotlin/creator/custom/providers/RemoteTemplateProvider.kt b/src/main/kotlin/creator/custom/providers/RemoteTemplateProvider.kt index 139530c2e..7e0bb5897 100644 --- a/src/main/kotlin/creator/custom/providers/RemoteTemplateProvider.kt +++ b/src/main/kotlin/creator/custom/providers/RemoteTemplateProvider.kt @@ -100,7 +100,7 @@ open class RemoteTemplateProvider : TemplateProvider { ): Boolean { indicator.text2 = "Updating remote repository $repoName" - val repoUrl = replaceVariables(originalRepoUrl) + val repoUrl = replaceVariables(originalRepoUrl, TemplateDescriptor.LATEST_FORMAT_VERSION) val manager = FuelManager() manager.proxy = selectProxy(repoUrl) @@ -147,7 +147,8 @@ open class RemoteTemplateProvider : TemplateProvider { protected suspend fun doLoadTemplates( context: WizardContext, repo: MinecraftSettings.TemplateRepo, - rawInnerPath: String + rawInnerPath: String, + version: Int? = null ): List { val remoteRootPath = RemoteTemplateRepo.getDestinationZip(repo.name) if (!remoteRootPath.exists()) { @@ -162,7 +163,8 @@ open class RemoteTemplateProvider : TemplateProvider { val modalityState = context.modalityState rootFile.refreshSync(modalityState) - val innerPath = replaceVariables(rawInnerPath) + // Default to the latest version for unspecified version variable substitution + val innerPath = replaceVariables(rawInnerPath, version ?: TemplateDescriptor.LATEST_FORMAT_VERSION) val repoRoot = if (innerPath.isNotBlank()) { rootFile.findFileByRelativePath(innerPath) } else { @@ -176,8 +178,8 @@ open class RemoteTemplateProvider : TemplateProvider { return TemplateProvider.findTemplates(modalityState, repoRoot) } - private fun replaceVariables(originalRepoUrl: String): String = - originalRepoUrl.replace($$"$version", TemplateDescriptor.FORMAT_VERSION.toString()) + private fun replaceVariables(originalRepoUrl: String, version: Int): String = + originalRepoUrl.replace($$"$version", version.toString()) override fun setupConfigUi( data: String, diff --git a/src/main/kotlin/creator/custom/providers/TemplateProvider.kt b/src/main/kotlin/creator/custom/providers/TemplateProvider.kt index 88a08644c..feb709f28 100644 --- a/src/main/kotlin/creator/custom/providers/TemplateProvider.kt +++ b/src/main/kotlin/creator/custom/providers/TemplateProvider.kt @@ -174,9 +174,9 @@ interface TemplateProvider { ): VfsLoadedTemplate? { descriptorFile.refreshSync(modalityState) var descriptor = Gson().fromJson(descriptorFile.readText()) - if (descriptor.version != TemplateDescriptor.FORMAT_VERSION) { + if (!TemplateDescriptor.SUPPORTED_FORMAT_VERSIONS.contains(descriptor.version)) { thisLogger().warn("Cannot handle template ${descriptorFile.path} of version ${descriptor.version}") - return null + return InvalidVersionTemplate(templateRoot, "Invalid Version", descriptor) } if (descriptor.hidden == true) { diff --git a/src/main/kotlin/creator/custom/providers/VfsLoadedTemplate.kt b/src/main/kotlin/creator/custom/providers/VfsLoadedTemplate.kt index c6c67ded4..b5cc273b2 100644 --- a/src/main/kotlin/creator/custom/providers/VfsLoadedTemplate.kt +++ b/src/main/kotlin/creator/custom/providers/VfsLoadedTemplate.kt @@ -25,7 +25,7 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.readText import java.io.FileNotFoundException -class VfsLoadedTemplate( +open class VfsLoadedTemplate( val templateRoot: VirtualFile, override val label: String, override val tooltip: String? = null, diff --git a/src/test/kotlin/creator/ClassFqnCreatorPropertyTest.kt b/src/test/kotlin/creator/ClassFqnCreatorPropertyTest.kt index 83031a879..60971578a 100644 --- a/src/test/kotlin/creator/ClassFqnCreatorPropertyTest.kt +++ b/src/test/kotlin/creator/ClassFqnCreatorPropertyTest.kt @@ -67,7 +67,7 @@ class ClassFqnCreatorPropertyTest : CreatorTemplateProcessorTestBase() { makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "BUILD_COORDS", diff --git a/src/test/kotlin/creator/CreatorTemplateProcessorTest.kt b/src/test/kotlin/creator/CreatorTemplateProcessorTest.kt index cf92a5571..5cf47b4c3 100644 --- a/src/test/kotlin/creator/CreatorTemplateProcessorTest.kt +++ b/src/test/kotlin/creator/CreatorTemplateProcessorTest.kt @@ -37,7 +37,7 @@ class CreatorTemplateProcessorTest : CreatorTemplateProcessorTestBase() { makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "PROP", @@ -62,7 +62,7 @@ class CreatorTemplateProcessorTest : CreatorTemplateProcessorTestBase() { makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "PROP", diff --git a/src/test/kotlin/creator/StringCreatorPropertyTest.kt b/src/test/kotlin/creator/StringCreatorPropertyTest.kt index faf4f6c34..96d00e65a 100644 --- a/src/test/kotlin/creator/StringCreatorPropertyTest.kt +++ b/src/test/kotlin/creator/StringCreatorPropertyTest.kt @@ -38,7 +38,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() { val reporter = makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING", @@ -63,7 +63,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() { makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING", @@ -100,7 +100,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() { val reporter = makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING", @@ -124,7 +124,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() { val reporter = makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING", @@ -149,7 +149,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() { val reporter = makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING", @@ -177,7 +177,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() { val reporter = makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "BOOL", @@ -206,7 +206,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() { val reporter = makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING", @@ -233,7 +233,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() { val reporter = makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING", @@ -260,7 +260,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() { makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING", @@ -302,7 +302,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() { makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING",