User: strokkur24 Date: 13 Apr 26 20:01 Revision: aeac990f5674b2d3f695bed5ad26f0f20c0e5b59 Summary: Add support for template version ranges and improve invalid template version error message (#2607) TeamCity URL: http://ci.mcdev.io:80/viewModification.html?tab=vcsModificationFiles&modId=10516&personal=false Index: src/main/kotlin/creator/custom/CustomPlatformStep.kt =================================================================== --- src/main/kotlin/creator/custom/CustomPlatformStep.kt (revision 5ea76a2fb417a03babdf5d02803223a362b0f5c4) +++ src/main/kotlin/creator/custom/CustomPlatformStep.kt (revision aeac990f5674b2d3f695bed5ad26f0f20c0e5b59) @@ -23,6 +23,7 @@ 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 @@ 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 @@ 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,10 +270,25 @@ templateLoadingProperty.set(false) noTemplatesAvailable.visible(newTemplates.isEmpty()) + if (newTemplates.any { checkInvalidVersionTemplate(it) }) { + availableTemplates = emptyList() + invalidTemplateVersion.visible(true) + } else { - availableTemplates = newTemplates + 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) { templateProcessor.generateFiles(project, selectedTemplate) } Index: src/main/kotlin/creator/custom/TemplateDescriptor.kt =================================================================== --- src/main/kotlin/creator/custom/TemplateDescriptor.kt (revision 5ea76a2fb417a03babdf5d02803223a362b0f5c4) +++ src/main/kotlin/creator/custom/TemplateDescriptor.kt (revision aeac990f5674b2d3f695bed5ad26f0f20c0e5b59) @@ -40,7 +40,8 @@ companion object { - const val FORMAT_VERSION = 3 + val SUPPORTED_FORMAT_VERSIONS = intArrayOf(3, 2, 1) + val LATEST_FORMAT_VERSION = SUPPORTED_FORMAT_VERSIONS[0]; } } Index: src/main/kotlin/creator/custom/providers/BuiltinTemplateProvider.kt =================================================================== --- src/main/kotlin/creator/custom/providers/BuiltinTemplateProvider.kt (revision 5ea76a2fb417a03babdf5d02803223a362b0f5c4) +++ src/main/kotlin/creator/custom/providers/BuiltinTemplateProvider.kt (revision aeac990f5674b2d3f695bed5ad26f0f20c0e5b59) @@ -38,7 +38,6 @@ 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,10 +59,12 @@ context: WizardContext, repo: MinecraftSettings.TemplateRepo ): Collection { - val remoteTemplates = doLoadTemplates(context, repo, builtinTemplatesInnerPath) + for (supportedVersion in TemplateDescriptor.SUPPORTED_FORMAT_VERSIONS) { + val remoteTemplates = doLoadTemplates(context, repo, "templates-${supportedVersion}", supportedVersion) - if (remoteTemplates.isNotEmpty()) { - return remoteTemplates - } + if (remoteTemplates.isNotEmpty()) { + return remoteTemplates + } + } val repoRoot = builtinTemplatesPath.virtualFile ?: return emptyList() Index: src/main/kotlin/creator/custom/providers/InvalidVersionTemplate.kt =================================================================== --- src/main/kotlin/creator/custom/providers/InvalidVersionTemplate.kt (revision aeac990f5674b2d3f695bed5ad26f0f20c0e5b59) +++ src/main/kotlin/creator/custom/providers/InvalidVersionTemplate.kt (revision aeac990f5674b2d3f695bed5ad26f0f20c0e5b59) @@ -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.") + } +} Index: src/main/kotlin/creator/custom/providers/RemoteTemplateProvider.kt =================================================================== --- src/main/kotlin/creator/custom/providers/RemoteTemplateProvider.kt (revision 5ea76a2fb417a03babdf5d02803223a362b0f5c4) +++ src/main/kotlin/creator/custom/providers/RemoteTemplateProvider.kt (revision aeac990f5674b2d3f695bed5ad26f0f20c0e5b59) @@ -100,7 +100,7 @@ ): 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 @@ 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 @@ 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 @@ 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, Index: src/main/kotlin/creator/custom/providers/TemplateProvider.kt =================================================================== --- src/main/kotlin/creator/custom/providers/TemplateProvider.kt (revision 5ea76a2fb417a03babdf5d02803223a362b0f5c4) +++ src/main/kotlin/creator/custom/providers/TemplateProvider.kt (revision aeac990f5674b2d3f695bed5ad26f0f20c0e5b59) @@ -174,9 +174,9 @@ ): 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) { Index: src/main/kotlin/creator/custom/providers/VfsLoadedTemplate.kt =================================================================== --- src/main/kotlin/creator/custom/providers/VfsLoadedTemplate.kt (revision 5ea76a2fb417a03babdf5d02803223a362b0f5c4) +++ src/main/kotlin/creator/custom/providers/VfsLoadedTemplate.kt (revision aeac990f5674b2d3f695bed5ad26f0f20c0e5b59) @@ -25,7 +25,7 @@ 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, Index: src/test/kotlin/creator/ClassFqnCreatorPropertyTest.kt =================================================================== --- src/test/kotlin/creator/ClassFqnCreatorPropertyTest.kt (revision 5ea76a2fb417a03babdf5d02803223a362b0f5c4) +++ src/test/kotlin/creator/ClassFqnCreatorPropertyTest.kt (revision aeac990f5674b2d3f695bed5ad26f0f20c0e5b59) @@ -67,7 +67,7 @@ makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "BUILD_COORDS", Index: src/test/kotlin/creator/CreatorTemplateProcessorTest.kt =================================================================== --- src/test/kotlin/creator/CreatorTemplateProcessorTest.kt (revision 5ea76a2fb417a03babdf5d02803223a362b0f5c4) +++ src/test/kotlin/creator/CreatorTemplateProcessorTest.kt (revision aeac990f5674b2d3f695bed5ad26f0f20c0e5b59) @@ -37,7 +37,7 @@ makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "PROP", @@ -62,7 +62,7 @@ makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "PROP", Index: src/test/kotlin/creator/StringCreatorPropertyTest.kt =================================================================== --- src/test/kotlin/creator/StringCreatorPropertyTest.kt (revision 5ea76a2fb417a03babdf5d02803223a362b0f5c4) +++ src/test/kotlin/creator/StringCreatorPropertyTest.kt (revision aeac990f5674b2d3f695bed5ad26f0f20c0e5b59) @@ -38,7 +38,7 @@ val reporter = makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING", @@ -63,7 +63,7 @@ makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING", @@ -100,7 +100,7 @@ val reporter = makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING", @@ -124,7 +124,7 @@ val reporter = makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING", @@ -149,7 +149,7 @@ val reporter = makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING", @@ -177,7 +177,7 @@ val reporter = makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "BOOL", @@ -206,7 +206,7 @@ val reporter = makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING", @@ -233,7 +233,7 @@ val reporter = makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING", @@ -260,7 +260,7 @@ makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING", @@ -302,7 +302,7 @@ makeTemplate( """ { - "version": ${TemplateDescriptor.FORMAT_VERSION}, + "version": ${TemplateDescriptor.LATEST_FORMAT_VERSION}, "properties": [ { "name": "STRING",