plugins/toolkit/jetbrains-core/build.gradle.kts (151 lines of code) (raw):
// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import com.jetbrains.plugin.structure.intellij.utils.JDOMUtil
import org.jdom2.Document
import org.jdom2.output.Format
import org.jdom2.output.XMLOutputter
import org.jetbrains.intellij.platform.gradle.tasks.PatchPluginXmlTask
import software.aws.toolkits.gradle.buildMetadata
import software.aws.toolkits.gradle.changelog.tasks.GeneratePluginChangeLog
import software.aws.toolkits.gradle.intellij.IdeFlavor
import software.aws.toolkits.gradle.intellij.IdeVersions
import software.aws.toolkits.gradle.isCi
import java.io.StringWriter
import java.nio.file.Path
import kotlin.io.path.inputStream
import kotlin.io.path.writeText
val toolkitVersion: String by project
val ideProfile = IdeVersions.ideProfile(project)
plugins {
id("java-library")
id("toolkit-kotlin-conventions")
id("toolkit-testing")
id("toolkit-intellij-subplugin")
id("toolkit-integration-testing")
}
intellijToolkit {
ideFlavor.set(IdeFlavor.IC)
}
dependencies {
intellijPlatform {
localPlugin(project(":plugin-core"))
bundledModule("intellij.platform.vcs.dvcs.impl")
bundledModule("intellij.libraries.microba")
}
}
val changelog = tasks.register<GeneratePluginChangeLog>("pluginChangeLog") {
includeUnreleased.set(true)
changeLogFile.set(project.file("$buildDir/changelog/change-notes.xml"))
}
tasks.compileJava {
// https://github.com/gradle/gradle/issues/26006
// consistently saves 6+ minutes in CI. we do not need incremental compilation for 2 java files
options.isIncremental = false
}
// toolkit depends on :plugin-toolkit:jetbrains-core setting the version instead of being defined on the root project
PatchPluginXmlTask.register(project)
val patchPluginXml = tasks.named<PatchPluginXmlTask>("patchPluginXml")
patchPluginXml.configure {
val buildSuffix = if (!project.isCi()) "+${buildMetadata()}" else ""
pluginVersion.set("$toolkitVersion-${ideProfile.shortName}$buildSuffix")
}
tasks.jar {
dependsOn(patchPluginXml, changelog)
from(changelog) {
into("META-INF")
}
from(patchPluginXml) {
duplicatesStrategy = DuplicatesStrategy.INCLUDE
into("META-INF")
}
}
tasks.integrationTest {
// cant run tests under authorization_grant with PKCE yet
systemProperty("aws.dev.useDAG", true)
}
val gatewayPluginXml = tasks.register<PatchPluginXmlTask>("pluginXmlForGateway") {
val buildSuffix = if (!project.isCi()) "+${buildMetadata()}" else ""
pluginVersion.set("GW-$toolkitVersion-${ideProfile.shortName}$buildSuffix")
}
val patchGatewayPluginXml by tasks.registering {
dependsOn(gatewayPluginXml)
val output = temporaryDir.resolve("plugin.xml")
outputs.file(output)
// jetbrains expects gateway plugin to be dynamic
doLast {
gatewayPluginXml.get().outputFile.asFile
.map(File::toPath)
.get()
.let { path ->
val document = path.inputStream().use { inputStream ->
JDOMUtil.loadDocument(inputStream)
}
document.rootElement
.getAttribute("require-restart")
.setValue("false")
transformXml(document, output.toPath())
}
}
}
val gatewayArtifacts by configurations.creating {
isCanBeConsumed = true
isCanBeResolved = false
// share same dependencies as default configuration
extendsFrom(configurations["implementation"], configurations["runtimeOnly"])
}
val gatewayJar = tasks.create<Jar>("gatewayJar") {
// META-INF/plugin.xml is a duplicate?
// unclear why the exclude() statement didn't work
duplicatesStrategy = DuplicatesStrategy.WARN
dependsOn(tasks.instrumentedJar, patchGatewayPluginXml)
archiveBaseName.set("aws-toolkit-jetbrains-IC-GW")
from(tasks.instrumentedJar.get().outputs.files.map { zipTree(it) }) {
exclude("**/plugin.xml")
exclude("**/plugin-intellij.xml")
exclude("**/inactive")
}
from(patchGatewayPluginXml) {
into("META-INF")
}
val pluginGateway = sourceSets.main.get().resources.first { it.name == "plugin-gateway.xml" }
from(pluginGateway) {
into("META-INF")
}
}
artifacts {
add("gatewayArtifacts", gatewayJar)
}
tasks.prepareSandbox {
// you probably do not want to modify this.
// this affects the IDE sandbox / build for `:jetbrains-core`, but will not propogate to the build generated by `:intellij`
// (which is what is ultimately published to the marketplace)
// without additional effort
}
tasks.testJar {
// classpath.index is a duplicate
duplicatesStrategy = DuplicatesStrategy.INCLUDE
// not sure why this is getting pulled in
exclude("**/plugin.xml")
}
tasks.processTestResources {
// TODO how can we remove this. Fails due to:
// "customerUploadedEventSchemaMultipleTypes.json.txt is a duplicate but no duplicate handling strategy has been set"
duplicatesStrategy = DuplicatesStrategy.INCLUDE
}
dependencies {
listOf(
libs.aws.apprunner,
libs.aws.cloudcontrol,
libs.aws.cloudformation,
libs.aws.cloudwatchlogs,
libs.aws.codecatalyst,
libs.aws.dynamodb,
libs.aws.ec2,
// libs.aws.ecr,
// libs.aws.ecs,
// libs.aws.iam,
// libs.aws.lambda,
libs.aws.rds,
libs.aws.redshift,
// libs.aws.s3,
libs.aws.schemas,
libs.aws.secretsmanager,
libs.aws.sns,
libs.aws.sqs,
libs.aws.services,
).forEach { api(it) { isTransitive = false } }
compileOnlyApi(project(":plugin-core:core"))
compileOnlyApi(project(":plugin-core:jetbrains-community"))
// TODO: remove Q dependency when split is fully done
implementation(libs.bundles.jackson)
implementation(libs.zjsonpatch)
testFixturesApi(testFixtures(project(":plugin-core:jetbrains-community")))
}
fun transformXml(document: Document, path: Path) {
val xmlOutput = XMLOutputter()
xmlOutput.format.apply {
indent = " "
omitDeclaration = true
textMode = Format.TextMode.TRIM
}
StringWriter().use {
xmlOutput.output(document, it)
path.writeText(text = it.toString())
}
}