1+ import com.fasterxml.jackson.databind.SerializationFeature
2+ import com.fasterxml.jackson.module.kotlin.jacksonMapperBuilder
13import com.github.jk1.license.filter.ExcludeTransitiveDependenciesFilter
24import com.github.jk1.license.render.JsonReportRenderer
5+ import com.jetbrains.plugin.structure.toolbox.ToolboxMeta
6+ import com.jetbrains.plugin.structure.toolbox.ToolboxPluginDescriptor
37import org.jetbrains.intellij.pluginRepository.PluginRepositoryFactory
48import org.jetbrains.kotlin.com.intellij.openapi.util.SystemInfoRt
59import org.jetbrains.kotlin.gradle.dsl.JvmTarget
610import java.nio.file.Path
11+ import kotlin.io.path.createDirectories
712import kotlin.io.path.div
13+ import kotlin.io.path.writeText
814
915plugins {
1016 alias(libs.plugins.kotlin)
@@ -14,23 +20,31 @@ plugins {
1420 alias(libs.plugins.ksp)
1521 alias(libs.plugins.gradle.wrapper)
1622 alias(libs.plugins.changelog)
23+ alias(libs.plugins.gettext)
1724}
1825
19- buildscript {
20- dependencies {
21- classpath(libs.marketplace.client)
22- }
23- }
2426
2527repositories {
2628 mavenCentral()
2729 maven(" https://packages.jetbrains.team/maven/p/tbx/toolbox-api" )
2830}
2931
32+ buildscript {
33+ repositories {
34+ mavenCentral()
35+ }
36+
37+ dependencies {
38+ classpath(libs.marketplace.client)
39+ classpath(libs.plugin.structure)
40+ }
41+ }
42+
3043jvmWrapper {
3144 unixJvmInstallDir = " jvm"
3245 winJvmInstallDir = " jvm"
33- linuxAarch64JvmUrl = " https://cache-redirector.jetbrains.com/intellij-jbr/jbr_jcef-21.0.5-linux-aarch64-b631.28.tar.gz"
46+ linuxAarch64JvmUrl =
47+ " https://cache-redirector.jetbrains.com/intellij-jbr/jbr_jcef-21.0.5-linux-aarch64-b631.28.tar.gz"
3448 linuxX64JvmUrl = " https://cache-redirector.jetbrains.com/intellij-jbr/jbr_jcef-21.0.5-linux-x64-b631.28.tar.gz"
3549 macAarch64JvmUrl = " https://cache-redirector.jetbrains.com/intellij-jbr/jbr_jcef-21.0.5-osx-aarch64-b631.28.tar.gz"
3650 macX64JvmUrl = " https://cache-redirector.jetbrains.com/intellij-jbr/jbr_jcef-21.0.5-osx-x64-b631.28.tar.gz"
@@ -39,24 +53,43 @@ jvmWrapper {
3953
4054dependencies {
4155 compileOnly(libs.bundles.toolbox.plugin.api)
42- implementation(libs.slf4j)
43- implementation(libs.bundles.serialization)
44- implementation(libs.coroutines.core)
56+ compileOnly(libs.bundles.serialization)
57+ compileOnly(libs.coroutines.core)
4558 implementation(libs.okhttp)
4659 implementation(libs.exec)
4760 implementation(libs.moshi)
4861 ksp(libs.moshi.codegen)
4962 implementation(libs.retrofit)
5063 implementation(libs.retrofit.moshi)
5164 testImplementation(kotlin(" test" ))
65+ testImplementation(libs.mokk)
66+ testImplementation(libs.bundles.toolbox.plugin.api)
5267}
5368
54- val pluginId = properties(" group" )
55- val pluginName = properties(" name" )
56- val pluginVersion = properties(" version" )
69+ val extension = ExtensionJson (
70+ id = properties(" group" ),
71+
72+ version = properties(" version" ),
73+ meta = ExtensionJsonMeta (
74+ name = " Coder Toolbox" ,
75+ description = " Connects your JetBrains IDE to Coder workspaces" ,
76+ vendor = " Coder" ,
77+ url = " https://github.com/coder/coder-jetbrains-toolbox-plugin" ,
78+ )
79+ )
80+
81+ val extensionJsonFile = layout.buildDirectory.file(" generated/extension.json" )
82+ val extensionJson by tasks.registering {
83+ inputs.property(" extension" , extension.toString())
84+
85+ outputs.file(extensionJsonFile)
86+ doLast {
87+ generateExtensionJson(extension, extensionJsonFile.get().asFile.toPath())
88+ }
89+ }
5790
5891changelog {
59- version.set(pluginVersion )
92+ version.set(extension.version )
6093 groups.set(emptyList())
6194 title.set(" Coder Toolbox Plugin Changelog" )
6295}
@@ -76,24 +109,30 @@ tasks.test {
76109 useJUnitPlatform()
77110}
78111
79- val assemblePlugin by tasks.registering(Jar ::class ) {
80- archiveBaseName.set(pluginId)
81- from(sourceSets.main.get().output)
112+
113+ tasks.jar {
114+ archiveBaseName.set(extension.id)
115+ dependsOn(extensionJson)
116+ from(extensionJson.get().outputs)
82117}
83118
84119val copyPlugin by tasks.creating(Sync ::class .java) {
85- dependsOn(assemblePlugin )
86- fromCompileDependencies( )
120+ dependsOn(tasks.jar )
121+ dependsOn(tasks.getByName( " generateLicenseReport " ) )
87122
123+ fromCompileDependencies()
88124 into(getPluginInstallDir())
89125}
90126
91127fun CopySpec.fromCompileDependencies () {
92- from(assemblePlugin.get().outputs.files)
128+ from(tasks.jar)
129+ from(extensionJson.get().outputs.files)
93130 from(" src/main/resources" ) {
94- include(" extension.json" )
95131 include(" dependencies.json" )
132+ }
133+ from(" src/main/resources" ) {
96134 include(" icon.svg" )
135+ rename(" icon.svg" , " pluginIcon.svg" )
97136 }
98137
99138 // Copy dependencies, excluding those provided by Toolbox.
@@ -106,18 +145,20 @@ fun CopySpec.fromCompileDependencies() {
106145 " core-api" ,
107146 " ui-api" ,
108147 " annotations" ,
148+ " localization-api"
109149 ).any { file.name.contains(it) }
110150 }
111151 },
112152 )
113153}
114154
115155val pluginZip by tasks.creating(Zip ::class ) {
116- dependsOn(assemblePlugin)
156+ archiveBaseName.set(properties(" name" ))
157+ dependsOn(tasks.jar)
158+ dependsOn(tasks.getByName(" generateLicenseReport" ))
117159
118160 fromCompileDependencies()
119- into(pluginId)
120- archiveBaseName.set(pluginName)
161+ into(extension.id) // folder like com.coder.toolbox
121162}
122163
123164tasks.register(" cleanAll" , Delete ::class .java) {
@@ -142,7 +183,7 @@ private fun getPluginInstallDir(): Path {
142183 else -> error(" Unknown os" )
143184 } / " plugins"
144185
145- return pluginsDir / pluginId
186+ return pluginsDir / extension.id
146187}
147188
148189val publishPlugin by tasks.creating {
@@ -158,17 +199,49 @@ val publishPlugin by tasks.creating {
158199 // instance.uploader.uploadNewPlugin(pluginZip.outputs.files.singleFile, listOf("toolbox", "gateway"), LicenseUrl.APACHE_2_0, ProductFamily.TOOLBOX)
159200
160201 // subsequent updates
161- instance.uploader.upload(pluginId , pluginZip.outputs.files.singleFile)
202+ instance.uploader.upload(extension.id , pluginZip.outputs.files.singleFile)
162203 }
163204}
164205
165- // For use with kotlin-language-server.
166- tasks.register(" classpath" ) {
167- doFirst {
168- File (" classpath" ).writeText(
169- sourceSets[" main" ].runtimeClasspath.asPath
206+ fun properties (key : String ) = project.findProperty(key).toString()
207+
208+ gettext {
209+ potFile = project.layout.projectDirectory.file(" src/main/resources/localization/defaultMessages.pot" )
210+ keywords = listOf (" ptrc:1c,2" , " ptrl" )
211+ }
212+
213+ // region will be moved to the gradle plugin late
214+ data class ExtensionJsonMeta (
215+ val name : String ,
216+ val description : String ,
217+ val vendor : String ,
218+ val url : String? ,
219+ )
220+
221+ data class ExtensionJson (
222+ val id : String ,
223+ val version : String ,
224+ val meta : ExtensionJsonMeta ,
225+ )
226+
227+ fun generateExtensionJson (extensionJson : ExtensionJson , destinationFile : Path ) {
228+ val descriptor = ToolboxPluginDescriptor (
229+ id = extensionJson.id,
230+ version = extensionJson.version,
231+ apiVersion = libs.versions.toolbox.plugin.api.get(),
232+ meta = ToolboxMeta (
233+ name = extensionJson.meta.name,
234+ description = extensionJson.meta.description,
235+ vendor = extensionJson.meta.vendor,
236+ url = extensionJson.meta.url,
170237 )
171- }
238+ )
239+ destinationFile.parent.createDirectories()
240+ destinationFile.writeText(
241+ jacksonMapperBuilder()
242+ .enable(SerializationFeature .INDENT_OUTPUT )
243+ .build()
244+ .writeValueAsString(descriptor)
245+ )
172246}
173-
174- fun properties (key : String ) = project.findProperty(key).toString()
247+ // endregion
0 commit comments