Skip to content

Commit aeac990

Browse files
authored
Add support for template version ranges and improve invalid template version error message (#2607)
1 parent 5ea76a2 commit aeac990

10 files changed

Lines changed: 72 additions & 27 deletions

src/main/kotlin/creator/custom/CustomPlatformStep.kt

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ package com.demonwav.mcdev.creator.custom
2323
import com.demonwav.mcdev.MinecraftSettings
2424
import com.demonwav.mcdev.asset.MCDevBundle
2525
import com.demonwav.mcdev.creator.custom.providers.EmptyLoadedTemplate
26+
import com.demonwav.mcdev.creator.custom.providers.InvalidVersionTemplate
2627
import com.demonwav.mcdev.creator.custom.providers.LoadedTemplate
2728
import com.demonwav.mcdev.creator.custom.providers.TemplateProvider
2829
import com.demonwav.mcdev.creator.modalityState
@@ -95,6 +96,7 @@ class CustomPlatformStep(
9596
val templateLoadingText2Property = propertyGraph.property<String>("")
9697
lateinit var templatePropertiesProcessIcon: Cell<AsyncProcessIcon>
9798
lateinit var noTemplatesAvailable: Cell<JLabel>
99+
lateinit var invalidTemplateVersion: Cell<JLabel>
98100
var templateLoadingJob: Job? = null
99101

100102
private val externalPropertyProvider = object : ExternalTemplatePropertyProvider {
@@ -200,6 +202,9 @@ class CustomPlatformStep(
200202
noTemplatesAvailable = label(MCDevBundle("creator.step.generic.no_templates_available.message"))
201203
.visible(false)
202204
.apply { component.foreground = JBColor.RED }
205+
invalidTemplateVersion = label("Invalid template version.")
206+
.visible(false)
207+
.apply { component.foreground = JBColor.RED }
203208
templatePropertyPlaceholder = placeholder().align(AlignX.FILL)
204209
}.topGap(TopGap.SMALL)
205210

@@ -265,8 +270,23 @@ class CustomPlatformStep(
265270

266271
templateLoadingProperty.set(false)
267272
noTemplatesAvailable.visible(newTemplates.isEmpty())
268-
availableTemplates = newTemplates
273+
if (newTemplates.any { checkInvalidVersionTemplate(it) }) {
274+
availableTemplates = emptyList()
275+
invalidTemplateVersion.visible(true)
276+
} else {
277+
availableTemplates = newTemplates
278+
invalidTemplateVersion.visible(false)
279+
}
280+
}
281+
}
282+
283+
private fun checkInvalidVersionTemplate(template: LoadedTemplate): Boolean {
284+
if (template is InvalidVersionTemplate) {
285+
invalidTemplateVersion.component.text = "Invalid template version: ${template.descriptor.version}. Supported " +
286+
"versions: [${TemplateDescriptor.SUPPORTED_FORMAT_VERSIONS.joinToString(", ")}]"
287+
return true;
269288
}
289+
return false
270290
}
271291

272292
override fun setupProject(project: Project) {

src/main/kotlin/creator/custom/TemplateDescriptor.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ data class TemplateDescriptor(
4040

4141
companion object {
4242

43-
const val FORMAT_VERSION = 3
43+
val SUPPORTED_FORMAT_VERSIONS = intArrayOf(3, 2, 1)
44+
val LATEST_FORMAT_VERSION = SUPPORTED_FORMAT_VERSIONS[0];
4445
}
4546
}
4647

src/main/kotlin/creator/custom/providers/BuiltinTemplateProvider.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ class BuiltinTemplateProvider : RemoteTemplateProvider() {
3838

3939
private val builtinRepoUrl = $$"https://github.com/minecraft-dev/templates/archive/refs/heads/v$version.zip"
4040
private val builtinTemplatesPath = PluginUtil.plugin.pluginPath.resolve("lib/resources/builtin-templates")
41-
private val builtinTemplatesInnerPath = "templates-${TemplateDescriptor.FORMAT_VERSION}"
4241
private var repoUpdated: Boolean = false
4342

4443
override val label: String = MCDevBundle("template.provider.builtin.label")
@@ -60,9 +59,11 @@ class BuiltinTemplateProvider : RemoteTemplateProvider() {
6059
context: WizardContext,
6160
repo: MinecraftSettings.TemplateRepo
6261
): Collection<LoadedTemplate> {
63-
val remoteTemplates = doLoadTemplates(context, repo, builtinTemplatesInnerPath)
64-
if (remoteTemplates.isNotEmpty()) {
65-
return remoteTemplates
62+
for (supportedVersion in TemplateDescriptor.SUPPORTED_FORMAT_VERSIONS) {
63+
val remoteTemplates = doLoadTemplates(context, repo, "templates-${supportedVersion}", supportedVersion)
64+
if (remoteTemplates.isNotEmpty()) {
65+
return remoteTemplates
66+
}
6667
}
6768

6869
val repoRoot = builtinTemplatesPath.virtualFile
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.demonwav.mcdev.creator.custom.providers
2+
3+
import com.demonwav.mcdev.creator.custom.TemplateDescriptor
4+
import com.intellij.openapi.vfs.VirtualFile
5+
6+
class InvalidVersionTemplate(
7+
templateRoot: VirtualFile,
8+
label: String,
9+
descriptor: TemplateDescriptor,
10+
tooltip: String? = null
11+
) : VfsLoadedTemplate(
12+
templateRoot,
13+
label,
14+
tooltip,
15+
descriptor,
16+
false
17+
) {
18+
override fun loadTemplateContents(path: String): String {
19+
throw NotImplementedError("You cannot load template contents of a template with an invalid version.")
20+
}
21+
}

src/main/kotlin/creator/custom/providers/RemoteTemplateProvider.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ open class RemoteTemplateProvider : TemplateProvider {
100100
): Boolean {
101101
indicator.text2 = "Updating remote repository $repoName"
102102

103-
val repoUrl = replaceVariables(originalRepoUrl)
103+
val repoUrl = replaceVariables(originalRepoUrl, TemplateDescriptor.LATEST_FORMAT_VERSION)
104104

105105
val manager = FuelManager()
106106
manager.proxy = selectProxy(repoUrl)
@@ -147,7 +147,8 @@ open class RemoteTemplateProvider : TemplateProvider {
147147
protected suspend fun doLoadTemplates(
148148
context: WizardContext,
149149
repo: MinecraftSettings.TemplateRepo,
150-
rawInnerPath: String
150+
rawInnerPath: String,
151+
version: Int? = null
151152
): List<LoadedTemplate> {
152153
val remoteRootPath = RemoteTemplateRepo.getDestinationZip(repo.name)
153154
if (!remoteRootPath.exists()) {
@@ -162,7 +163,8 @@ open class RemoteTemplateProvider : TemplateProvider {
162163
val modalityState = context.modalityState
163164
rootFile.refreshSync(modalityState)
164165

165-
val innerPath = replaceVariables(rawInnerPath)
166+
// Default to the latest version for unspecified version variable substitution
167+
val innerPath = replaceVariables(rawInnerPath, version ?: TemplateDescriptor.LATEST_FORMAT_VERSION)
166168
val repoRoot = if (innerPath.isNotBlank()) {
167169
rootFile.findFileByRelativePath(innerPath)
168170
} else {
@@ -176,8 +178,8 @@ open class RemoteTemplateProvider : TemplateProvider {
176178
return TemplateProvider.findTemplates(modalityState, repoRoot)
177179
}
178180

179-
private fun replaceVariables(originalRepoUrl: String): String =
180-
originalRepoUrl.replace($$"$version", TemplateDescriptor.FORMAT_VERSION.toString())
181+
private fun replaceVariables(originalRepoUrl: String, version: Int): String =
182+
originalRepoUrl.replace($$"$version", version.toString())
181183

182184
override fun setupConfigUi(
183185
data: String,

src/main/kotlin/creator/custom/providers/TemplateProvider.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,9 +174,9 @@ interface TemplateProvider {
174174
): VfsLoadedTemplate? {
175175
descriptorFile.refreshSync(modalityState)
176176
var descriptor = Gson().fromJson<TemplateDescriptor>(descriptorFile.readText())
177-
if (descriptor.version != TemplateDescriptor.FORMAT_VERSION) {
177+
if (!TemplateDescriptor.SUPPORTED_FORMAT_VERSIONS.contains(descriptor.version)) {
178178
thisLogger().warn("Cannot handle template ${descriptorFile.path} of version ${descriptor.version}")
179-
return null
179+
return InvalidVersionTemplate(templateRoot, "Invalid Version", descriptor)
180180
}
181181

182182
if (descriptor.hidden == true) {

src/main/kotlin/creator/custom/providers/VfsLoadedTemplate.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import com.intellij.openapi.vfs.VirtualFile
2525
import com.intellij.openapi.vfs.readText
2626
import java.io.FileNotFoundException
2727

28-
class VfsLoadedTemplate(
28+
open class VfsLoadedTemplate(
2929
val templateRoot: VirtualFile,
3030
override val label: String,
3131
override val tooltip: String? = null,

src/test/kotlin/creator/ClassFqnCreatorPropertyTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class ClassFqnCreatorPropertyTest : CreatorTemplateProcessorTestBase() {
6767
makeTemplate(
6868
"""
6969
{
70-
"version": ${TemplateDescriptor.FORMAT_VERSION},
70+
"version": ${TemplateDescriptor.LATEST_FORMAT_VERSION},
7171
"properties": [
7272
{
7373
"name": "BUILD_COORDS",

src/test/kotlin/creator/CreatorTemplateProcessorTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class CreatorTemplateProcessorTest : CreatorTemplateProcessorTestBase() {
3737
makeTemplate(
3838
"""
3939
{
40-
"version": ${TemplateDescriptor.FORMAT_VERSION},
40+
"version": ${TemplateDescriptor.LATEST_FORMAT_VERSION},
4141
"properties": [
4242
{
4343
"name": "PROP",
@@ -62,7 +62,7 @@ class CreatorTemplateProcessorTest : CreatorTemplateProcessorTestBase() {
6262
makeTemplate(
6363
"""
6464
{
65-
"version": ${TemplateDescriptor.FORMAT_VERSION},
65+
"version": ${TemplateDescriptor.LATEST_FORMAT_VERSION},
6666
"properties": [
6767
{
6868
"name": "PROP",

src/test/kotlin/creator/StringCreatorPropertyTest.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() {
3838
val reporter = makeTemplate(
3939
"""
4040
{
41-
"version": ${TemplateDescriptor.FORMAT_VERSION},
41+
"version": ${TemplateDescriptor.LATEST_FORMAT_VERSION},
4242
"properties": [
4343
{
4444
"name": "STRING",
@@ -63,7 +63,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() {
6363
makeTemplate(
6464
"""
6565
{
66-
"version": ${TemplateDescriptor.FORMAT_VERSION},
66+
"version": ${TemplateDescriptor.LATEST_FORMAT_VERSION},
6767
"properties": [
6868
{
6969
"name": "STRING",
@@ -100,7 +100,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() {
100100
val reporter = makeTemplate(
101101
"""
102102
{
103-
"version": ${TemplateDescriptor.FORMAT_VERSION},
103+
"version": ${TemplateDescriptor.LATEST_FORMAT_VERSION},
104104
"properties": [
105105
{
106106
"name": "STRING",
@@ -124,7 +124,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() {
124124
val reporter = makeTemplate(
125125
"""
126126
{
127-
"version": ${TemplateDescriptor.FORMAT_VERSION},
127+
"version": ${TemplateDescriptor.LATEST_FORMAT_VERSION},
128128
"properties": [
129129
{
130130
"name": "STRING",
@@ -149,7 +149,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() {
149149
val reporter = makeTemplate(
150150
"""
151151
{
152-
"version": ${TemplateDescriptor.FORMAT_VERSION},
152+
"version": ${TemplateDescriptor.LATEST_FORMAT_VERSION},
153153
"properties": [
154154
{
155155
"name": "STRING",
@@ -177,7 +177,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() {
177177
val reporter = makeTemplate(
178178
"""
179179
{
180-
"version": ${TemplateDescriptor.FORMAT_VERSION},
180+
"version": ${TemplateDescriptor.LATEST_FORMAT_VERSION},
181181
"properties": [
182182
{
183183
"name": "BOOL",
@@ -206,7 +206,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() {
206206
val reporter = makeTemplate(
207207
"""
208208
{
209-
"version": ${TemplateDescriptor.FORMAT_VERSION},
209+
"version": ${TemplateDescriptor.LATEST_FORMAT_VERSION},
210210
"properties": [
211211
{
212212
"name": "STRING",
@@ -233,7 +233,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() {
233233
val reporter = makeTemplate(
234234
"""
235235
{
236-
"version": ${TemplateDescriptor.FORMAT_VERSION},
236+
"version": ${TemplateDescriptor.LATEST_FORMAT_VERSION},
237237
"properties": [
238238
{
239239
"name": "STRING",
@@ -260,7 +260,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() {
260260
makeTemplate(
261261
"""
262262
{
263-
"version": ${TemplateDescriptor.FORMAT_VERSION},
263+
"version": ${TemplateDescriptor.LATEST_FORMAT_VERSION},
264264
"properties": [
265265
{
266266
"name": "STRING",
@@ -302,7 +302,7 @@ class StringCreatorPropertyTest : CreatorTemplateProcessorTestBase() {
302302
makeTemplate(
303303
"""
304304
{
305-
"version": ${TemplateDescriptor.FORMAT_VERSION},
305+
"version": ${TemplateDescriptor.LATEST_FORMAT_VERSION},
306306
"properties": [
307307
{
308308
"name": "STRING",

0 commit comments

Comments
 (0)